您好,登錄后才能下訂單哦!
1.
所謂OCP即指對擴展開放(當新需求出現的時候,可以通過擴展現有模型達到目的),對修改關閉(對已有的二進制代碼,不允許進行修改)。
實現OCP原則的關鍵是抽象與封裝。利用抽象封裝完成對需求可能發生變更的部分進行處理,具體處理手段如下:
做一個繼承樹。此方案針對會發生修改但不是很嚴重的地方,讓需求擴展的實體繼承已經存在的實體。
例如: 裝飾者模式、策略模式、狀態模式、橋模式
運行時注冊:
使用Event style或Observer pattern實現運行時注冊的方式,當需要進行擴展時,就讓擴展的方法監聽某個事件,事件發生時這個方式就會被調用(service lookup)
配置文件:
使用配置文件進行啟動時綁定,將需要修改、擴展的信息寫在配置文件中,通過解析配置文件來決定做什么事情(DataDriven)
繼承多態方式(LSP)
構件更替:
如果需要修改、擴展,則在加載模塊的時候使用修改/擴展的模塊,實現加載綁定。一般是將變化的部分寫在一個.dll 文件中,變化的時候直接更新.dll 文件。(ReflectiveorMeta-LevelDesign)
預定義協議:
在兩個之間預定義協議,然后各個進程可以獨立進行變化,只要通信協議不變。
例如TCP/IP等協議(Uniform Access)
下文有詳細講述
變化來源于內部,即自己做完某件事情后把自己的狀態改掉。
多態(繼承)與聚合
其中多態(繼承)適合于1 of N的情況,父類中封裝共性部分,子類中封裝可變性部分
聚合適合于M of N的情況,whole角色類封裝共性部分,part角色類封裝可變性部分
1、如果一個對象集之間除共性外,有超過2個的差異行為,如何處理?
做多個策略樹
2、如果一個對象集的部分行為組存在差異性,如何處理?
部分行為綁定在一棵策略樹
3、如果一個對象集的部分屬性(以及依賴于這些屬性的方法)存在差異性,如何處理?
把屬性和方法做成策略樹
4、如果一個對象集的一個行為需要協作對象來完成,但是它們的協作對象存在差異性,如
何處理?
將“調用協作對象”這一過程置于Strategy中,Command Pattern的變體
5、如果一個對象集的行為因為屬性的取值而存在差異性,如何處理?
State Pattern
1)避免重復——只做一次:重復往往代表著耦合,修改一部分重復代碼表示要修改其他的
2)DIP:Dependency Inversion Principle,依賴倒置原則,即細節應當依賴于抽象,抽象不應當依賴于細節;在要被其他模塊implement的模塊中定義接口,這是一種去除依賴減少耦合的基本方式
3)繼承:共性和差異性
4)設計模式
中介模式
定義封裝一組對象交互方式的對象;中介通過避免對象互相顯式引用提升了松散耦合;讓你獨立的差異交互;集中控制
橋接模式
成果:解耦了接口和實現——消除了編譯時依賴,改善了可擴展性,對client隱藏了實現細節
1)依賴倒置:如果抽象實體需要依賴于具體實體的話,那么為具體實體做一個接口,抽象實體可以依賴于這個接口,具體實體則實現這個接口
2) 外觀模式:Faade是用戶和子系統之間的一層間接,它封裝子系統的內部實現并對用戶提供訪問接口,將這二者解耦
3) 代理模式:Proxy是用戶和實際實體之間的一層間接,它負責轉發用戶的請求到實際實體,對實際實體進行訪問控制,將這二者解耦
4) 適配器模式:應用中使用了一個接口Target,這個Target的一個實現需 要使用到一個其他實現,但是那個實現與當前的接口不一致。讓Target的實現實體聚合一個Adaptee的對象,做成對象Adapter,當用戶對 Adapter有請求的時候,Adapter便將請求轉發給Adaptee。同時,Adapter還需要實現用戶要求的但是在Adaptee沒有實現的職 責,不僅僅是轉發請求。(client->Adapter->Adaptee)
5) Event-Style事件風格:使用一個事件處理機制,其他模塊可以向處理對象提供事件,也可以將自己的方法注冊到某個事件,當這個事件發生之后,處理對象會調用注冊到這個事件的所有方法,實現事件源和注冊方法的解耦
意圖:定義對象間的一種一對多的依賴關系,當一個對象的狀態發生改變時,所有依賴于
它的對象都得到通知并被自動更新
適用場景:
(1)當對一個對象的改變需要同時改變其它對象,而不知道具體有多少對象有待改變。
(2)當一個對象必須通知其他對象,而他又不能假定其他對象是誰。換言之,你不希望這
些對象四緊密耦合的。
(3)當一個模型有兩個方面,其中一個方面依賴于另一個方面。將這二者封裝在獨立的對
象中以使它們可以各自獨立的改變和復用。
優點:
靈活性、可變性、復用性得到保證。目標與觀察者之間耦合程度降低,實現抽象耦合,允許
獨立的改變目標和觀察者,可以復用目標對象而無需同時復用其觀察者。
支持廣播通信,目標者不必知道觀察者是誰
缺點:
增加系統復雜程度,對于系統的理解和測試更加困難。
一個觀察者的無意的更新可能引起其他觀察者的意外的更新,也容易引起更更新錯誤,而這
種錯誤難以捕捉。
相比Observer Pattern,可以實現對多個事件的監聽。即實現對象間多對多的依賴關系。
其他特點同Observer Pattern
意圖:將一個請求封裝為一個對象,從而使你可用不同的請求對客戶進行參數化;請求排
隊或記錄請求日志,以及支持可撤銷的操作。
適用場景:
(1)抽象出待執行的操作以參數化某對象。
(2)在不同的時候制定、排列和執行請求。
(3)通過在實施操作之前將狀態存儲起來以支持撤銷操作。
(4)支持修改日志,這樣當系統崩潰時,這些修改可以被重做一遍。
優點:
將調用操作的對象與知道如何實現該操作的對象解耦。
可以將命令存儲在棧或隊列中以支持請求排隊,命令處理模式維護一個歷史信息。
可以容易的支持undo和redo操作,但是必須存儲額外的狀態信息以避免滯后影響問題。
擴展Command對象很容易。
Creator創建者:對于A、B兩個對象,在以下情況下A創建B對象:A聚合了B的對象;A包含了B的對象;A記錄了B對象的引用;A使用了B的對象;在A中包含初始化B對象的數據
Coupling低耦合:在A聚合、包含、記錄、使用B的情況下,如果將創建B對象的職責賦予其他對象,則A需要與其他對象產生多余的耦合
Cohesion高內聚:在A中包含初始化B對象的數據的情況下,則A為信息專家,根據高內聚原則,A應當承擔B對象創建的職責
(2)場景二:實例個數有限制
以singleton為基礎進行改進
(3)場景三:一個類不知道它所必須創建的對象的類;一個類希望有他的子類來制定它所創建的對象;類將創建對象這一職責委托給多個幫助子類中的一個,并且希望將哪一個幫助子類作為代理者這一信息局部化
Factory Method
(4)場景四:控制子類拓展,子類與父類的算法框架相同,但局部實現方法不同
Template MethodPattern
(5)場景五:多個需創建的類實例之間存在類型依賴關系
Abstract FactoryMethod
(6)場景六:實例的創建和初始化很復雜,例如運行時刻制定要實例化的類;初始化時變量值發生變更
Prototype Pattern
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。