摘要:开放封闭原则应该算是这几个原则里面最容易理解的一个。另外,语句就是开放封闭原则的死敌这个是状态模式中的一个例子。处理开放封闭模式的特例我们都是人,不可能一开始都写出完美的代码。
开放-封闭原则应该算是这几个原则里面最容易理解的一个。它的宗旨就是:
如果你想扩展或者改变一个程序的功能,可以增加代码,但是不能改变程序的源码。
如果,是对于那些码农来说,最快捷的办法就是改变源码,但是我们面向的是更复杂的项目,我们的目的不是当码农,而是要做一名代码艺术家,想完成一件艺术品一样去完成我们的项目。
拿装饰者模式的例子来说吧。 如果我们想改变onload的函数,即,其他小伙伴,有可能已经在onload上面绑定好,我们可以翻阅onload代码,进行修改。 但是,这个扩展性简直啦!!!
从装饰者模式可以知道,我们可以使用引用装饰进行改动。
var fn = window.onload; var change = function(){ fn(); conosle.log("整洁代码"); } window.onload = function(){ change(); }
当然,我们也可以使用AOP,进行一个装饰,将原来代码实现的功能完全保留,只在外部添加一些代码。
另外,if语句就是开放封闭原则的死敌.
这个是状态模式中的一个例子。
if(state === "auto"){ console.log("制热"); state = "hot"; }else if(state === "hot"){ console.log("制冷"); state = "cold"; }else if(state === "cold"){ console.log("送风"); state = "wind"; }else if(state === "wind"){ console.log("除湿"); state = "dry"; }else if(state === "dry"){ console.log("自动"); state = "auto"; }
可以从上面的代码看出,如果功能继续发生变化,你必须做的就是改动原来代码的内容,这是极不可取的。 所以依照开放封闭原则,我们需要进行优化,可以修改为这样
//定义状态 var Auto= function(button){ this.turn = button; } Auto.prototype.press= function(){ console.log("制热"); this.turn.setState("hot"); } var Hot = function(button){ this.turn = button; } Hot.prototype.press= function(){ console.log("制冷"); this.turn.setState("cold"); } var Cold = function(button){ this.turn = button; } Cold.prototype.press= function(){ console.log("送风"); this.turn.setState("wind"); } var Wind = function(button){ this.turn = button; } Wind.prototype.press= function(){ console.log("除湿"); this.turn.setState("dry"); } var Dry = function(button){ this.turn = button; } Dry.prototype.press= function(){ console.log("自动"); this.turn.setState("auto"); } //定义状态仓库 var Remoter = function(){ this.auto = new Auto(this); this.hot = new Hot(this); this.cold = new Cold(this); this.wind = new Wind(this); this.dry = new Dry(this); this.state = "auto"; } Remoter.prototype.setState = function(state){ this.state=state; } Remoter.prototype.press = function(){ this[this.state].press(); //执行对应状态的press } Remoter.prototype.init = function(){ //定义执行者 document.querySelector(".switch").addEventListener("click",()=>{ this.press(); },false); } new Remoter.init(); //初始化
即,使用对象的多态性,消除条件分支语句。
处理开放封闭模式的特例我们都是人,不可能一开始都写出完美的代码。但我们在写程序的时候,要永远的给自己留一手,以便后面改动的需要。 在模板模式里,我们给特殊性留了一条后路, 我们使用钩子方法,通过外部的设置,我们可以得到不用的结果。
当然,我们还可以使用callback函数,执行自己想要做的功能,比如在$.ajax调用的时候,我们添加回调函数,执行自己想要的函数功能,这些都是很棒的实现开放封闭模式原则的办法。
这里想说的就是,原则是一份指导,能够指引你的代码结果怎样做,可以达到最优的形式,但,事实上,我们遵不遵守,是完全取决于个人而言的。 而且,有时候我们写程序,真的不必过分追求设计,因为我们是完成用户的交付的需求,如果一味追求设计,无疑增加代码的难度,和实现的时间。所以,一切跟着感觉走,我们写程序不也是凭感觉写的吗?
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/78568.html
摘要:今天说一下,单一职责原则。比如,接口的地址本来已经很完美了,但是你的是处女座最讨厌处女座非要给路由添加几个以保证后台数据的安全。为了过年,我会选择使用,因为不知道处女座以后会做出什么傻事来。此时的使用动态织入后,可以完美的解决处女座。 在设计模式中,有着几条视为黄金原则,设计模式都是围绕黄金原则,对代码或者说是架构设计做出一些相应的调整,久而久之,GoF 4人组,发现其实有些设计思想可...
摘要:单一职责原则开闭原则里氏替换原则依赖倒置原则接口隔离原则迪米特法则组合聚合复用原则单一职责原则高内聚低耦合定义不要存在多于一个导致类变更的原因。建议接口一定要做到单一职责,类的设计尽量做到只有一个原因引起变化。使用继承时遵循里氏替换原则。 单一职责原则 开闭原则 里氏替换原则 依赖倒置原则 接口隔离原则 迪米特法则 组合/聚合复用原则 单一职责原则(Single Responsi...
摘要:开放封闭原则是面向对象设计的核心所在,遵循这个原则可以避免许多不可避免的麻烦。而且能极大的增加软件的可扩展性可维护性和可复用性。依赖倒转原则定义高层模块不应该依赖低层模块。 1.最重要的原则:开放-封闭原则 定义:原件实体(类、模块、函数等等)应该可以扩展,但是不可修改 public class Calculate { public void operate(int a, in...
摘要:什么是代理模式代理模式,类似于明星的经纪人,想要拜访明星,需要先通过经纪人的沟通。不同于装饰器,那种动态加载一个对象,可以说在代理模式当中,代理是早已既定的。又称单一功能原则,面向对象五个基本原则之一。 什么是代理模式 代理模式,类似于明星的经纪人,想要拜访明星,需要先通过经纪人的沟通。而在JS当中,如果想访问一个类,需要通过另一个类来间接访问 。不同于装饰器,那种动态加载一个对象,可...
摘要:面向对象设计的五大原则单一职责原则接口隔离原则开放封闭原则替换原则依赖倒置原则。主要是针对继承的设计原则,继承与派生多态是的主要特性。 面向对象设计的五大原则:单一职责原则、接口隔离原则、开放-封闭原则、替换原则、依赖倒置原则。这些原则主要是由Robert C.Martin在《敏捷软件开发——原则、方法、与实践》一书中总结出来,这五大原则也是23种设计模式的基础。 单一职责原则 Sin...
阅读 2035·2021-11-08 13:22
阅读 2499·2021-09-04 16:40
阅读 1143·2021-09-03 10:29
阅读 1708·2019-08-30 15:44
阅读 2119·2019-08-30 11:13
阅读 2784·2019-08-29 17:07
阅读 1962·2019-08-29 14:22
阅读 1243·2019-08-26 14:00