当前位置: 首页 > Web前端 > JavaScript

几种常用设计模式的简单示例

时间:2023-03-26 23:59:46 JavaScript

序言模式是在一定的上下文中解决问题的方法。设计模式(Designpattern)是对代码设计经验的总结,被反复使用,为大多数人所熟知,分类归类。为了保证代码的可靠性,提高代码的复用率,让代码更易于维护和阅读,我们需要合理地理解和使用设计模式。在日常开发中,在某些特定场景下,你的处理方式可能不是很理想。往往这个时候,可以借助一些设计模式,让你优雅高效的实现这些逻辑。常用的设计模式。单例模式:定义:一个类只返回一个实例,一旦创建再次调用,就直接返回。使用场景:比如自定义弹窗,无论你的程序调用多少次,都应该只创建一个弹窗对象。类CreateUser{constructor(name){this.name=name;这个.getName();}getName(){返回这个名称;}};constProxyMode=(()=>{letinstance=null;return(name)=>{if(!instance){instance=newCreateUser(name);}returninstance;}})();leta=ProxyMode('vn');让b=ProxyMode('lb');控制台。日志(a,b);//vnvn单例模式只会创建一次实例策略模式:定义:定义一个只关注各个方法算法实现的策略类,并定义调用这些方法的接口。特点:代码优雅,可读性高。//strategyclassconstlevelObj={"A":money=>money*4,"B":money=>money*3,"C":money=>money*2}//环境类封装调用接口constgetMoney=(等级,金钱)=>levelObj[等级](金钱);console.log(getMoney('A',200))//800代理模式:定义:为对象提供代理项或占位符,以便控件访问它。使用场景:比如懒加载图片,先缓存动态加载,必要时传入src。constimgFunc=(()=>{让imgNode=document.createElement('img');document.body.appendChild(imgNode);返回{setSrc:(src)=>{imgNode.src=src;}}})();constProxyImg=(()=>{letimg=newImage();img.onload=()=>{letnode=document.getElementsByTagName('img')imgFunc.setSrc(img.src);}return{setSrc:(src)=>{imgFunc.setSrc('../C3photo/jacky/1.jpg');img.src=src;}}})();ProxyImg.setSrc('../C3photo/jacky/2.jpg');装饰者模式:定义:装饰者模式可以在不改变对象本身的情况下,在程序运行过程中动态地为对象添加职责。使用场景:类似拦截器,添加对象的前后事件等。Function.prototype.before=function(beforefn){let_self=this;返回函数(){beforefn.apply(this,arguments);返回_self.apply(this,arguments);}}Function.prototype.after=function(afterfn){let_self=this;returnfunction(){letret=_self.apply(this,arguments);afterfn.apply(this,arguments);返还;}}letfunc=function(){console.log('2');}//func1和func3是挂载函数letfunc1=function(){console.log('1');}letfunc3=function(){console.log('3');}func=func.before(func1).after(func3);func();//123发布-订阅模式:定义:订阅者(Subscriber)向调度中心(EventChannel)注册(Subscribe)他要订阅的事件,当发布者(Publisher)将事件(PublishEvent)发布到调度中心,即事件触发时,调度中心的统一调度(FireEvent)订阅者注册到调度中心的处理代码。使用场景:微信公众号的订阅leteventEmitter={list:{},on(event,fn){//订阅let_this=this;_this.list[事件]=_this.list[事件]||[];_this.list[事件].push(fn);返回_this;},emit(){//发布let_this=this;让event=[].shift.call(arguments),fns=_this.list[event];如果(fns&&fns.length){fns.forEach((fn)=>fn.apply(_this,arguments));}返回_this;},off(event,fn){//取消订阅let_this=this;让fns=_this.list[事件];如果(!fns)返回false;如果(!fn){fns.length=0;}else{for(leti=0;i{console.log("用户1订阅了:",content);};constuser2=(content)=>{console.log("用户2订阅:",content);};constuser3=(content)=>{console.log("User3subscribed:",content);};//订阅eventEmitter.on("article1",user1);eventEmitter.on("article1",user2);eventEmitter.on("article2",user3);eventEmitter.emit("article1","Javascript发布-订阅模式");eventEmitter.emit("article2","Javascript观察者模式");eventEmitter.off("article1",user1);eventEmitter.emit("article1","Javascriptpublish-subscribepattern");//用户1订阅:Javascript发布订阅模式//用户2订阅:Javascript发布订阅模式//用户3订阅:Javascript观察者模式//网友2订阅:Javascript发布-订阅模式总结学习设计模式不仅可以让我们用好这些成功的设计模式,更重要的是可以让我们深刻理解面向对象的设计思想~~本篇到此结束,感谢阅读!~学习有趣的知识,认识有趣的朋友,塑造有趣的灵魂!大家好,我是〖编程三昧〗的作者王隐,我的公众号是《编程三昧》,欢迎关注,希望大家多多指教!你来,怀揣期待,我以墨香迎接你!您归来,不分得失,只送回味!知识与技能并重,内功与外功并重,理论与实践两手抓,两手都要用力!