You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
<iframe height="265" style="width: 100%;" scrolling="no" title="策略模式" src="https://codepen.io/xiaotiandada/embed/xxZOBvG?height=265&theme-id=dark&default-tab=js,result" frameborder="no" allowtransparency="true" allowfullscreen="true">
See the Pen 策略模式 by xiaotiandada
(@xiaotiandada) on CodePen.
</iframe>
<iframe height="265" style="width: 100%;" scrolling="no" title="中介者模式" src="https://codepen.io/xiaotiandada/embed/abdBOvp?height=265&theme-id=dark&default-tab=js,result" frameborder="no" allowtransparency="true" allowfullscreen="true">
See the Pen 中介者模式 by xiaotiandada
(@xiaotiandada) on CodePen.
</iframe>
// https://fanerge.github.io/2017/js%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F-%E8%AE%BF%E9%97%AE%E8%80%85%E6%A8%A1%E5%BC%8F.html// 没太理解...functionVisitor(){this.visit=function(ConceteElement){ConceteElement.doSomething()}}functionConceteElement(){this.doSomething=function(){console.log('this is a element')}this.accept=function(visitor){visitor.visit(this)}}letvisitor=newVisitor()letconceteElement=newConceteElement()conceteElement.accept(visitor)
// https://fanerge.github.io/2017/js%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F-%E6%A8%A1%E7%89%88%E6%96%B9%E6%B3%95%E6%A8%A1%E5%BC%8F.htmlconstITInterview=function(){}ITInterview.prototype.writeTest=function(){console.log('this is a write test')}ITInterview.prototype.technicalInterView=function(){console.log('this is a technical interview')}ITInterview.prototype.leader=function(){console.log('this is a leader interview')}ITInterview.prototype.waitNotice=function(){console.log('wait notice')}ITInterview.prototype.init=function(){this.writeTest()this.technicalInterView()this.leader()this.waitNotice()}constitInterview=newITInterview()itInterview.init()// baiduconstBaiDuITInterview=function(){}BaiDuITInterview.prototype=newITInterview()BaiDuITInterview.prototype.writeTest=function(){console.log('this is a baidu write test')}BaiDuITInterview.prototype.technicalInterView=function(){console.log('this is a baidu technical interview')}constbaiduItInterview=newBaiDuITInterview()baiduItInterview.init()
// https://fanerge.github.io/2017/js%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F-%E8%81%8C%E8%B4%A3%E9%93%BE%E6%A8%A1%E5%BC%8F.html// 定义:职责链模式(Chain of responsibility)是使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止。职责链模式的名字非常形象,一系列可能会处理请求的对象被该连接成一条链,请求在这些对象之间依次传递,直到遇到一个可以处理它的对象,我们把这些对象成为链中的节点。// 500 元客户订单varorder500=function(orderType,pay,stock){if(orderType===1&&pay){console.log('500 rmb deposit, get 100 coupon ')}else{return'nextSuccessor'// unknow the next node but always pass to next.}};// 200 元客户订单varorder200=function(orderType,pay,stock){if(orderType===2&&pay){console.log('200 rmb deposit , get 50 coupon')}else{return'nextSuccessor';}};// 无预约客户订单varorderNormal=function(orderType,pay,stock){if(stock>0){console.log('normal buy no coupon')}else{console.log('the stock lack')}};letChain=function(fn){this.fn=fnthis.successor=null}Chain.prototype.setNextSuccessor=function(successor){returnthis.successor=successor}Chain.prototype.passRequest=function(){letret=this.fn.apply(this,arguments)if(ret==='nextSuccessor'){returnthis.successor&&this.successor.passRequest.apply(this.successor,arguments)}returnret}// 现在我们把3个订单函数分别包装成职责链的节点varchainOrder500=newChain(order500);varchainOrder200=newChain(order200);varchainOrderNormal=newChain(orderNormal);// 这里我们把上面封装的节点连成一条线,依次判断执行chainOrder500.setNextSuccessor(chainOrder200)chainOrder200.setNextSuccessor(chainOrderNormal)// 测试代码chainOrder500.passRequest(1,true,6);// 500 rmb deposit, get 100 couponchainOrder500.passRequest(2,true,4);// 200 rmb deposit , get 50 couponchainOrderNormal.passRequest(2,true,0);// 200 rmb deposit , get 50 coupon
状态模式
// https://fanerge.github.io/2017/js%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F-%E7%8A%B6%E6%80%81%E6%A8%A1%E5%BC%8F.html// 定义:状态模式(State)定义一个对象,这个对象可以通过管理其状态从而使得应用程序作出相应的变化。vartrafficLight=(function(){varcurrentLight=null;return{change: function(light){currentLight=light;currentLight.go();}}})();// 红灯functionRedLight(){}RedLight.prototype.go=function(){console.log("this is red light");}// 绿灯functionGreenLight(){}GreenLight.prototype.go=function(){console.log("this is green light");}// 黄灯functionYellowLight(){}YellowLight.prototype.go=function(){console.log("this is yellow light");}trafficLight.change(newRedLight());// this is red lighttrafficLight.change(newYellowLight());// this is yellow lightfunctionMenu(){}Menu.prototype.toggle=function(state){state();}varmenuStates={"show": function(){console.log("the menu is showing");},"hide": function(){console.log("the menu is hiding");}};varmenu=newMenu();menu.toggle(menuStates.show);menu.toggle(menuStates.hide);
2020-02-26 23:57:00
第一次学习设计模式 repo 所有的代码都在这儿啦!
工厂模式
相关资料:
JavaScript设计模式总结
js设计模式-工厂模式
创建三个角色然后随机决斗⚔️
输出
因为第一次学习 还不太知道具体的优点和好处 也没办法口喷 所以暂时留个坑给自己 下次更加了解之后回来填坑 🍑
单例模式
https://juejin.im/post/5c984610e51d45656702a785
https://fanerge.github.io/2017/js%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F-%E5%8D%95%E4%BE%8B%E6%A8%A1%E5%BC%8F.html
我的理解为一个类仅有一个实例, 并且全局访问都是相同的实例
建议先看完上面文章的单例模块, 我觉得他们总结得比我要好
这只是一个简单的示范... 🍑
装饰器模式
https://juejin.im/post/5c984610e51d45656702a785
https://fanerge.github.io/2017/js%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F-%E8%A3%85%E9%A5%B0%E8%80%85%E6%A8%A1%E5%BC%8F.html
核心就在
after
before
了比较基础的演示了 :)
代理模式
https://fanerge.github.io/2017/js%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F-%E4%BB%A3%E7%90%86%E6%A8%A1%E5%BC%8F.html
策略模式
https://fanerge.github.io/2017/js%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F-%E7%AD%96%E7%95%A5%E6%A8%A1%E5%BC%8F.html
简单的使用
ps: 策略模式指的是定义一系列的算法,把它们一个个封装起来,将不变的部分和变化的部分隔开,
实际就是将算法的使用和实现分离出来;
表单验证
我在原有的code上加了一个方法(错误展示, 比较基础所以很多地方没有考虑到)
<iframe height="265" style="width: 100%;" scrolling="no" title="策略模式" src="https://codepen.io/xiaotiandada/embed/xxZOBvG?height=265&theme-id=dark&default-tab=js,result" frameborder="no" allowtransparency="true" allowfullscreen="true"> See the Pen 策略模式 by xiaotiandada (@xiaotiandada) on CodePen. </iframe>中介者模式
https://fanerge.github.io/2017/js%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F-%E4%B8%AD%E4%BB%8B%E8%80%85%E6%A8%A1%E5%BC%8F.html
定义:中介者模式的作用就是解除对象与对象之间的紧耦合关系
发布订阅模式
迭代器模式
桥接模式
https://fanerge.github.io/2017/js%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F-%E6%A1%A5%E6%8E%A5%E6%A8%A1%E5%BC%8F.html
定义:桥接模式(Bridge)将抽象部分与它的实现部分分离,使它们都可以独立地变化。
外观模式
访问者模式
模版方法模式
定义:模板方法模式由二部分组成,第一部分是抽象父类,第二部分是具体实现的子类,一般的情况下是抽象父类封装了子类的算法框架,包括实现一些公共方法及封装子类中所有方法的执行顺序,子类可以继承这个父类,并且可以在子类中重写父类的方法,从而实现自己的业务逻辑。
组合模式
定义:组合模式(Composite)将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。
备忘录模式
定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样就可以将该对象恢复到原先保存的状态
职责链模式
状态模式
享元模式
The text was updated successfully, but these errors were encountered: