Web开发应该了解的5种设计模式转载本文请联系前端进阶路径公众号。什么是设计模式?设计模式是针对软件设计和开发过程中反复出现的某一类问题的通用解决方案。设计模式更多的是指导思想和方法论,而不是现成的代码。当然,每种设计模式在每种语言中都有特定的实现。学习设计模式更多的是理解各种模式的内在思想和解决方案。毕竟这是无数前人经验总结出来的最佳实践,代码实现是加深理解的辅助手段。设计模式用于可重用的代码,使代码更容易被他人理解,并保证代码的可靠性。在这篇文章中,我将介绍JavaScript中常见的五种设计模式的实际使用场景:那个例子。实现方法是判断对象是否有实例。如果已经存在,则不会再次创建。使用场景只适用于业务场景中的一个实例,如弹窗、购物车等。单例模式分为懒惰和饥饿。:惰性风格letShopCar=(function(){letinstance;functioninit(){/*在这里定义单例代码*/return{buy(good){this.goods.push(good);},goods:[],};}return{getInstance:function(){if(!instance){instance=init();}returninstance;},};})();letcar1=ShopCar.getInstance();letcar2=ShopCar.getInstance();car1.buy('orange');car2.buy('apple');console.log(car1.goods);//['orange','apple']console.log(car1===car2);//真饿了么中国风varShopCar=(function(){varinstance=init();functioninit(){/*这里定义了单例代码*/return{buy(good){this.goods.push(good);},goods:[],};}return{getInstance:function(){returninstance;},};})();letcar1=ShopCar.getInstance();letcar2=ShopCar.getInstance();car1.buy('橙色');car2.buy('apple');//['orange','apple']console.log(car1.goods);console.log(car1===car2);//加载类时真正的懒惰风格,不创建实例,类加载速度快,但运行时获取对象速度慢;饿了么中文风格是在类加载的时候初始化的,所以类加载慢,但是对象获取速度快策略模式定义策略模式定义1一系列的算法,封装了各个算法,让它们可以相互替代。实现方法定义了一组可变的策略类来封装具体的算法,定义了一组常量环境类将请求委托给某个策略类。使用场景适用于需要判断多个条件,甚至是复杂条件嵌套的业务场景,可以使用策略模式来提高代码的可维护性和可读性。例如支付和博客权限验证的实现示例//定义几个策略类varPaymentMethodStrategy={BankAccount:function(money){returnmoney>50?money*0.7:money;},CreditCard:function(money){returnmoney*0.8;},Alipay:function(money){returnmoney;},};/*环境类*/varuserPay=function(selectedStrategy,money){returnPaymentMethodStrategy[selectedStrategy](money);};console.log('银行卡支付价格为:'+userPay('BankAccount',100));//70console.log('支付宝支付价格为:'+userPay('Alipay',100));//100console.log('信用卡支付价格为:'+userPay('CreditCard',100));//80观察者模式定义观察者模式是对象的行为模式,定义了对象之间一对多的依赖关系,即多个观察者和一个被观察者当被观察对象发生变化时,所有的观察者对象都会得到通知,它们会执行相应的操作。实现方法定义了一组可变的策略类来封装具体的算法,定义了一组常量环境类将请求委托给某个策略类。使用场景适用于业务场景。当一个对象的状态发生变化时,需要自动通知其他人。关联对象,自动刷新对象状态,或者执行对应对象的方法。比如你是老师,需要通知班里的家长,你可以创建一个群(列表)。每次通知一个事件,只需要循环遍历这个列表(群发)即可,不用关心这个列表中有谁。实现实例//创建一个group,保存通知,通知变化后通知每个parent(触发所有观察者对象)classGroup{constructor(){this.message='nonotification';this.parents=[];}getMessage(){returnthis.message;}setMassage(message){this.message=message;this.notifyAllObservers();}notifyAllObservers(){this.parents.forEach((parent)=>{parent.update();});}attach(parent){this.parents.push(parent);}}//观察者,每个父类Parent{constructor(name,group){this.name=name;this.group=group;this.group.attach(this);}update(){console.log(`${this.name}收到通知:${this.group.getMessage()}`);}}letgroup=newGroup();lett1=newParent('李妈妈',group);lett2=newParent('王爸爸',group);lett3=newParent('张爷爷',group);group.setMassage('开家长会');group.setMassage('开运动会');/*李妈妈收到通知:召开家长会王爸爸收到通知:开家长会张爷爷收到通知:开运动会*/publish-subscribemodedefinitionpublish-subscribemode指的是对象(Subscriber)希望通过自定义事件订阅主题接收基于某个主题的通知,发布事件的对象(Publisher)发布主题事件方法通知每个订阅该主题的Subscriber对象。实现constpubSub={list:{},subscribe(key,fn){//subscribeif(!this.list[key]){this.list[key]=[];}this.list[key].push(fn);},publish(){//发布constarg=arguments;constkey=Array.prototype.shift.call(arg);constfns=this.list[key];if(!fns||fns.length<=0)returnfalse;for(vari=0,len=fns.length;i
