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