如果覺得還有點用谱煤,請您給我一個贊!您的贊是我堅持下去的動力禽拔!
為了不為學習設計模式而學習設計模式,我們從實際運用的角度來看一下常用的設計模式,我會用盡量少的代碼來描述設計模式
- 工廠模式
產(chǎn)生規(guī)定規(guī)格內(nèi)的相似對象
應用場景:創(chuàng)建組件刘离、創(chuàng)建各類對象等
function createPerson(name,age,sex){
let obj=new Object();
obj.name=name;
obj.age=age;
obj.sex=sex;
return obj;
}
- 觀察者模式
每次觸發(fā)行為將通知所有的觀察者
應用場景:事件監(jiān)聽、攔截器
let eatWacher=[fn,fn2,fn3];//存放所有的觀察者
function eat(){
console.log('eatting');
eatWacher.map((fn)=>{fn()});//當觸發(fā)一個事件時,通知所有的觀察者
}
- 單體模式
對象只被實例化一次睹栖,重復調(diào)用時為已創(chuàng)建的實例
應用場景:只需要創(chuàng)建一次對象即可的硫惕,比如全局的組件
function getInstance(){
if(!this.instance){
this.instance=new Object();
}
return this.instance;
}
- 訂閱-發(fā)布模式
訂閱者像訂閱中心預定自己關心的消息類型
訂閱中心在收到事件的時候,分發(fā)給訂閱者他們關心的事務
應用場景:消息中心
var buyPhoneEvent={
list:[],
listen(key,fn){
this.list[key]=this.list[key]||[];
this.list[key].push(fn);
},
tigger(...params){
var key = (params&¶ms[0])?params[0]:"";
if(!key)return;
var lst = this.list[key];
if(!lst||lst.length===0)return;
lst.map((fn)=>{fn.apply(this,params)})
}
};
buyPhoneEvent.listen('iphone',(...params)=>{console.log(`buy iphone ${params[0]}-${params[1]}`)});
buyPhoneEvent.listen('huawei',(...params)=>{console.log(`buy huawei ${params[0]}-${params[1]}`)});
buyPhoneEvent.tigger("iphone","4999");
buyPhoneEvent.tigger("huawei","2999");
buyPhoneEvent.tigger("xiaomi","999");
- 利用閉包和Map給數(shù)據(jù)創(chuàng)建表野来,利用查表法快速查找數(shù)據(jù)
使用場景:
有一個幾萬長度的員工列表恼除,需要快速能找到員工對應的數(shù)據(jù)
function makeBufferMap(list){
let map = {};
list.forEach(item=>map[item]=true);//這里true也可以換成數(shù)據(jù)
return function (val){
return map[val];
}
}
var findStaff = makeBufferMap(['jack','tom','peter']);
findStaff('jack');//true
findStaff('a');//false
findStaff('peter');//true