摘要:開放封閉原則應(yīng)該算是這幾個原則里面最容易理解的一個。另外,語句就是開放封閉原則的死敵這個是狀態(tài)模式中的一個例子。處理開放封閉模式的特例我們都是人,不可能一開始都寫出完美的代碼。
開放-封閉原則應(yīng)該算是這幾個原則里面最容易理解的一個。它的宗旨就是:
如果你想擴(kuò)展或者改變一個程序的功能,可以增加代碼,但是不能改變程序的源碼。
如果,是對于那些碼農(nóng)來說,最快捷的辦法就是改變源碼,但是我們面向的是更復(fù)雜的項(xiàng)目,我們的目的不是當(dāng)碼農(nóng),而是要做一名代碼藝術(shù)家,想完成一件藝術(shù)品一樣去完成我們的項(xiàng)目。
拿裝飾者模式的例子來說吧。 如果我們想改變onload的函數(shù),即,其他小伙伴,有可能已經(jīng)在onload上面綁定好,我們可以翻閱onload代碼,進(jìn)行修改。 但是,這個擴(kuò)展性簡直啦?。?!
從裝飾者模式可以知道,我們可以使用引用裝飾進(jìn)行改動。
var fn = window.onload; var change = function(){ fn(); conosle.log("整潔代碼"); } window.onload = function(){ change(); }
當(dāng)然,我們也可以使用AOP,進(jìn)行一個裝飾,將原來代碼實(shí)現(xiàn)的功能完全保留,只在外部添加一些代碼。
另外,if語句就是開放封閉原則的死敵.
這個是狀態(tài)模式中的一個例子。
if(state === "auto"){ console.log("制熱"); state = "hot"; }else if(state === "hot"){ console.log("制冷"); state = "cold"; }else if(state === "cold"){ console.log("送風(fēng)"); state = "wind"; }else if(state === "wind"){ console.log("除濕"); state = "dry"; }else if(state === "dry"){ console.log("自動"); state = "auto"; }
可以從上面的代碼看出,如果功能繼續(xù)發(fā)生變化,你必須做的就是改動原來代碼的內(nèi)容,這是極不可取的。 所以依照開放封閉原則,我們需要進(jìn)行優(yōu)化,可以修改為這樣
//定義狀態(tài) 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("送風(fēng)"); 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"); } //定義狀態(tài)倉庫 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(); //執(zhí)行對應(yīng)狀態(tài)的press } Remoter.prototype.init = function(){ //定義執(zhí)行者 document.querySelector(".switch").addEventListener("click",()=>{ this.press(); },false); } new Remoter.init(); //初始化
即,使用對象的多態(tài)性,消除條件分支語句。
處理開放封閉模式的特例我們都是人,不可能一開始都寫出完美的代碼。但我們在寫程序的時候,要永遠(yuǎn)的給自己留一手,以便后面改動的需要。 在模板模式里,我們給特殊性留了一條后路, 我們使用鉤子方法,通過外部的設(shè)置,我們可以得到不用的結(jié)果。
當(dāng)然,我們還可以使用callback函數(shù),執(zhí)行自己想要做的功能,比如在$.ajax調(diào)用的時候,我們添加回調(diào)函數(shù),執(zhí)行自己想要的函數(shù)功能,這些都是很棒的實(shí)現(xiàn)開放封閉模式原則的辦法。
這里想說的就是,原則是一份指導(dǎo),能夠指引你的代碼結(jié)果怎樣做,可以達(dá)到最優(yōu)的形式,但,事實(shí)上,我們遵不遵守,是完全取決于個人而言的。 而且,有時候我們寫程序,真的不必過分追求設(shè)計(jì),因?yàn)槲覀兪峭瓿捎脩舻慕桓兜男枨?,如果一味追求設(shè)計(jì),無疑增加代碼的難度,和實(shí)現(xiàn)的時間。所以,一切跟著感覺走,我們寫程序不也是憑感覺寫的嗎?
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/78568.html
摘要:今天說一下,單一職責(zé)原則。比如,接口的地址本來已經(jīng)很完美了,但是你的是處女座最討厭處女座非要給路由添加幾個以保證后臺數(shù)據(jù)的安全。為了過年,我會選擇使用,因?yàn)椴恢捞幣院髸龀鍪裁瓷凳聛?。此時的使用動態(tài)織入后,可以完美的解決處女座。 在設(shè)計(jì)模式中,有著幾條視為黃金原則,設(shè)計(jì)模式都是圍繞黃金原則,對代碼或者說是架構(gòu)設(shè)計(jì)做出一些相應(yīng)的調(diào)整,久而久之,GoF 4人組,發(fā)現(xiàn)其實(shí)有些設(shè)計(jì)思想可...
摘要:單一職責(zé)原則開閉原則里氏替換原則依賴倒置原則接口隔離原則迪米特法則組合聚合復(fù)用原則單一職責(zé)原則高內(nèi)聚低耦合定義不要存在多于一個導(dǎo)致類變更的原因。建議接口一定要做到單一職責(zé),類的設(shè)計(jì)盡量做到只有一個原因引起變化。使用繼承時遵循里氏替換原則。 單一職責(zé)原則 開閉原則 里氏替換原則 依賴倒置原則 接口隔離原則 迪米特法則 組合/聚合復(fù)用原則 單一職責(zé)原則(Single Responsi...
摘要:開放封閉原則是面向?qū)ο笤O(shè)計(jì)的核心所在,遵循這個原則可以避免許多不可避免的麻煩。而且能極大的增加軟件的可擴(kuò)展性可維護(hù)性和可復(fù)用性。依賴倒轉(zhuǎn)原則定義高層模塊不應(yīng)該依賴低層模塊。 1.最重要的原則:開放-封閉原則 定義:原件實(shí)體(類、模塊、函數(shù)等等)應(yīng)該可以擴(kuò)展,但是不可修改 public class Calculate { public void operate(int a, in...
摘要:什么是代理模式代理模式,類似于明星的經(jīng)紀(jì)人,想要拜訪明星,需要先通過經(jīng)紀(jì)人的溝通。不同于裝飾器,那種動態(tài)加載一個對象,可以說在代理模式當(dāng)中,代理是早已既定的。又稱單一功能原則,面向?qū)ο笪鍌€基本原則之一。 什么是代理模式 代理模式,類似于明星的經(jīng)紀(jì)人,想要拜訪明星,需要先通過經(jīng)紀(jì)人的溝通。而在JS當(dāng)中,如果想訪問一個類,需要通過另一個類來間接訪問 。不同于裝飾器,那種動態(tài)加載一個對象,可...
摘要:面向?qū)ο笤O(shè)計(jì)的五大原則單一職責(zé)原則接口隔離原則開放封閉原則替換原則依賴倒置原則。主要是針對繼承的設(shè)計(jì)原則,繼承與派生多態(tài)是的主要特性。 面向?qū)ο笤O(shè)計(jì)的五大原則:單一職責(zé)原則、接口隔離原則、開放-封閉原則、替換原則、依賴倒置原則。這些原則主要是由Robert C.Martin在《敏捷軟件開發(fā)——原則、方法、與實(shí)踐》一書中總結(jié)出來,這五大原則也是23種設(shè)計(jì)模式的基礎(chǔ)。 單一職責(zé)原則 Sin...
閱讀 2067·2021-11-08 13:22
閱讀 2534·2021-09-04 16:40
閱讀 1174·2021-09-03 10:29
閱讀 1741·2019-08-30 15:44
閱讀 2142·2019-08-30 11:13
閱讀 2818·2019-08-29 17:07
閱讀 1991·2019-08-29 14:22
閱讀 1273·2019-08-26 14:00