時間:2023-09-11 16:24:02 | 來源:網(wǎng)站運營
時間:2023-09-11 16:24:02 來源:網(wǎng)站運營
掌握前端5大常用設計模式,瞬間高大上:主要介紹一下我們平常會經(jīng)常用到的設計模式,設計模式總的來說有23種,而設計模式在前端中又該怎么運用呢,接下來主要對比較前端中常見的設計模式做一個介紹let UserFactory = function (role) { function SuperAdmin() { this.name = "超級管理員", this.viewPage = ['首頁', '用戶管理', '訂單管理', '應用管理', '權限管理'] } function Admin() { this.name = "管理員", this.viewPage = ['首頁', '訂單管理', '應用管理'] } function NormalUser() { this.name = '普通用戶', this.viewPage = ['首頁', '訂單管理'] } switch (role) { case 'superAdmin': return new SuperAdmin(); break; case 'admin': return new Admin(); break; case 'user': return new NormalUser(); break; default: throw new Error('參數(shù)錯誤, 可選參數(shù):superAdmin、admin、user'); }}//調(diào)用let superAdmin = UserFactory('superAdmin');let admin = UserFactory('admin')let normalUser = UserFactory('user')
總結(jié):在上面的例子中,UserFactory就是一個簡單工廠,在該函數(shù)中有3個構(gòu)造函數(shù)分別對應不同的權限的用戶,當我們調(diào)用工廠函數(shù)時,只需要傳遞superAdmin, admin, user這三個可選參數(shù)中的一個獲取對應的實例對象//安全模式創(chuàng)建的工廠方法函數(shù) let UserFactory = function(role) { if(this instanceof UserFactory) { var s = new this[role](); return s; } else { return new UserFactory(role); } } //工廠方法函數(shù)的原型中設置所有對象的構(gòu)造函數(shù) UserFactory.prototype = { SuperAdmin: function() { this.name = "超級管理員", this.viewPage = ['首頁', '用戶管理', '訂單管理', '應用管理', '權限管理'] }, Admin: function() { this.name = "管理員", this.viewPage = ['首頁', '訂單管理', '應用管理'] }, NormalUser: function() { this.name = '普通用戶', this.viewPage = ['首頁', '訂單管理'] } } //調(diào)用 let superAdmin = UserFactory('SuperAdmin'); let admin = UserFactory('Admin') let normalUser = UserFactory('NormalUser')
總結(jié):在簡單工廠中,如果我們新增加一個用戶類型,需要修改兩個地方的代碼,一個是增加新的用戶構(gòu)造函數(shù),一個是在邏輯判斷中增加對新的用戶的判斷,而在抽象工廠方法中,我們只需要在UserFactory.prototype中添加就可以啦。var single = (function(){ var unique; function getInstance(){ // 如果該實例存在,則直接返回,否則就對其實例化 if( unique === undefined ){ unique = new Construct(); } return unique; } function Construct(){ // ... 生成單例的構(gòu)造函數(shù)的代碼 } return { getInstance : getInstance } })();
總結(jié):在上面的代碼中,我們可以使用single.getInstance來獲取到單例,并且每次調(diào)用均獲取到同一個單例,在我們平時的開發(fā)中,我們也經(jīng)常會用到這種模式,比如當我們單擊登錄按鈕的時候,頁面中會出現(xiàn)一個登錄框,而這個浮窗是唯一的,無論單擊多少次登錄按鈕,這個浮窗只會被創(chuàng)建一次,因此這個登錄浮窗就適合用單例模式。(function(){ // 示例代碼 // 目標對象,是真正被代理的對象 function Subject(){} Subject.prototype.request = function(){}; /** * 代理對象 * @param {Object} realSubject [持有被代理的具體的目標對象] */ function Proxy(realSubject){ this.realSubject = readSubject; } Proxy.prototype.request = function(){ this.realSubject.request(); }; }());
總結(jié):在上面的代碼中,Proxy可以控制對真正被代理對象的一個訪問,在代理模式中,比較常見的就是虛擬代理,虛擬代理用于控制對那種創(chuàng)建開銷很大的本體的訪問,它會把本體的實例化推遲到有方法被調(diào)用的時候,比如說,現(xiàn)在我們假設PublicLibrary的實例化很慢,不能在網(wǎng)頁加載的時候立即完成,我們可以為其創(chuàng)建一個虛擬代理,讓它把PublicLibrary的實例化推遲到必要的時候,比如說我們在前端中經(jīng)常用到的圖片懶加載,就可以用虛擬代理;document.body.addEventListener("click", function() { alert("Hello World") },false ) document.body.click() //模擬用戶點擊
總結(jié):在上面的例子中,需要監(jiān)聽用戶點擊 document.body 的動作,但是我們是沒辦法預知用戶將在什么時候點擊的,因此我們訂閱了 document.body 的 click 事件,當 body 節(jié)點被點擊時,body 節(jié)點便會向訂閱者發(fā)布 “Hello World” 消息。function Price(personType, price) { //vip 5 折 if (personType == 'vip') { return price * 0.5; } else if (personType == 'old'){ //老客戶 3 折 return price * 0.3; } else { return price; //其他都全價 } }
在上面的代碼中,我們需要很多個判斷,如果有很多優(yōu)惠,我們又需要添加很多判斷,這里已經(jīng)違背了剛才說的設計模式的六大原則中的開閉原則了,如果使用策略模式,我們的代碼可以這樣寫:// 對于vip客戶 function vipPrice() { this.discount = 0.5; } vipPrice.prototype.getPrice = function(price) { return price * this.discount; } // 對于老客戶 function oldPrice() { this.discount = 0.3; } oldPrice.prototype.getPrice = function(price) { return price * this.discount; } // 對于普通客戶 function Price() { this.discount = 1; } Price.prototype.getPrice = function(price) { return price ; } // 上下文,對于客戶端的使用 function Context() { this.name = ''; this.strategy = null; this.price = 0; } Context.prototype.set = function(name, strategy, price) { this.name = name; this.strategy = strategy; this.price = price; } Context.prototype.getResult = function() { console.log(this.name + ' 的結(jié)賬價為: ' + this.strategy.getPrice(this.price)); } var context = new Context(); var vip = new vipPrice(); context.set ('vip客戶', vip, 200); context.getResult(); // vip客戶 的結(jié)賬價為: 100 var old = new oldPrice(); context.set ('老客戶', old, 200); context.getResult(); // 老客戶 的結(jié)賬價為: 60 var Price = new Price(); context.set ('普通客戶', Price, 200); context.getResult(); // 普通客戶 的結(jié)賬價為: 200
總結(jié):在上面的代碼中,通過策略模式,使得客戶的折扣與算法解藕,又使得修改跟擴展能獨立的進行,不影到客戶端或其他算法的使用。關鍵詞:模式,高大,設計,掌握
微信公眾號
版權所有? 億企邦 1997-2025 保留一切法律許可權利。