摘要:開放封閉原則應該算是這幾個原則里面最容易理解的一個。另外,語句就是開放封閉原則的死敵這個是狀態模式中的一個例子。處理開放封閉模式的特例我們都是人,不可能一開始都寫出完美的代碼。
開放-封閉原則應該算是這幾個原則里面最容易理解的一個。它的宗旨就是:
如果你想擴展或者改變一個程序的功能,可以增加代碼,但是不能改變程序的源碼。
如果,是對于那些碼農來說,最快捷的辦法就是改變源碼,但是我們面向的是更復雜的項目,我們的目的不是當碼農,而是要做一名代碼藝術家,想完成一件藝術品一樣去完成我們的項目。
拿裝飾者模式的例子來說吧。 如果我們想改變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調用的時候,我們添加回調函數,執行自己想要的函數功能,這些都是很棒的實現開放封閉模式原則的辦法。
這里想說的就是,原則是一份指導,能夠指引你的代碼結果怎樣做,可以達到最優的形式,但,事實上,我們遵不遵守,是完全取決于個人而言的。 而且,有時候我們寫程序,真的不必過分追求設計,因為我們是完成用戶的交付的需求,如果一味追求設計,無疑增加代碼的難度,和實現的時間。所以,一切跟著感覺走,我們寫程序不也是憑感覺寫的嗎?
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/78568.html
摘要:今天說一下,單一職責原則。比如,接口的地址本來已經很完美了,但是你的是處女座最討厭處女座非要給路由添加幾個以保證后臺數據的安全。為了過年,我會選擇使用,因為不知道處女座以后會做出什么傻事來。此時的使用動態織入后,可以完美的解決處女座。 在設計模式中,有著幾條視為黃金原則,設計模式都是圍繞黃金原則,對代碼或者說是架構設計做出一些相應的調整,久而久之,GoF 4人組,發現其實有些設計思想可...
摘要:單一職責原則開閉原則里氏替換原則依賴倒置原則接口隔離原則迪米特法則組合聚合復用原則單一職責原則高內聚低耦合定義不要存在多于一個導致類變更的原因。建議接口一定要做到單一職責,類的設計盡量做到只有一個原因引起變化。使用繼承時遵循里氏替換原則。 單一職責原則 開閉原則 里氏替換原則 依賴倒置原則 接口隔離原則 迪米特法則 組合/聚合復用原則 單一職責原則(Single Responsi...
摘要:開放封閉原則是面向對象設計的核心所在,遵循這個原則可以避免許多不可避免的麻煩。而且能極大的增加軟件的可擴展性可維護性和可復用性。依賴倒轉原則定義高層模塊不應該依賴低層模塊。 1.最重要的原則:開放-封閉原則 定義:原件實體(類、模塊、函數等等)應該可以擴展,但是不可修改 public class Calculate { public void operate(int a, in...
摘要:什么是代理模式代理模式,類似于明星的經紀人,想要拜訪明星,需要先通過經紀人的溝通。不同于裝飾器,那種動態加載一個對象,可以說在代理模式當中,代理是早已既定的。又稱單一功能原則,面向對象五個基本原則之一。 什么是代理模式 代理模式,類似于明星的經紀人,想要拜訪明星,需要先通過經紀人的溝通。而在JS當中,如果想訪問一個類,需要通過另一個類來間接訪問 。不同于裝飾器,那種動態加載一個對象,可...
摘要:面向對象設計的五大原則單一職責原則接口隔離原則開放封閉原則替換原則依賴倒置原則。主要是針對繼承的設計原則,繼承與派生多態是的主要特性。 面向對象設計的五大原則:單一職責原則、接口隔離原則、開放-封閉原則、替換原則、依賴倒置原則。這些原則主要是由Robert C.Martin在《敏捷軟件開發——原則、方法、與實踐》一書中總結出來,這五大原則也是23種設計模式的基礎。 單一職責原則 Sin...
閱讀 2045·2021-11-08 13:22
閱讀 2506·2021-09-04 16:40
閱讀 1151·2021-09-03 10:29
閱讀 1716·2019-08-30 15:44
閱讀 2124·2019-08-30 11:13
閱讀 2791·2019-08-29 17:07
閱讀 1967·2019-08-29 14:22
閱讀 1249·2019-08-26 14:00