溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

體系結(jié)構(gòu)之設(shè)計模式在設(shè)計原則中的應(yīng)用

發(fā)布時間:2020-06-28 19:35:19 來源:網(wǎng)絡(luò) 閱讀:738 作者:Hyman1994 欄目:軟件技術(shù)

一、數(shù)據(jù)保護

1.




二、OCP(開閉原則)的手段


所謂OCP即指對擴展開放(當(dāng)新需求出現(xiàn)的時候,可以通過擴展現(xiàn)有模型達到目的),對修改關(guān)閉(對已有的二進制代碼,不允許進行修改)。
實現(xiàn)OCP原則的關(guān)鍵是抽象與封裝。利用抽象封裝完成對需求可能發(fā)生變更的部分進行處理,具體處理手段如下:

1.使用多態(tài)的方式

   做一個繼承樹。此方案針對會發(fā)生修改但不是很嚴重的地方,讓需求擴展的實體繼承已經(jīng)存在的實體。

2.使用繼承與組合聯(lián)合的方式

   例如: 裝飾者模式、策略模式、狀態(tài)模式、橋模式

3.延遲綁定:

運行時注冊:

使用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)

4.信息隱藏

下文有詳細講述

5.泛化模塊:Interpreter-Driven

6.限制交互路徑

迪米特法則:一個對象應(yīng)該對其他對象有盡可能少的了解


三、一個模塊的信息隱藏有哪兩種基本類型,各自有哪些典型的處理手段? 

1. 每個模塊有一個基本的secret——外部的行為和內(nèi)部隱藏

每個模塊隱藏重要的設(shè)計決策的實現(xiàn),只有模塊的組成可以了解細節(jié)。所有的設(shè)計決策都獨立于彼此。一個模塊的接口功能與模塊內(nèi)部程序細節(jié)的分離。給出功能接口,隱藏功能實現(xiàn)程序的細節(jié)

方法:

外觀模式Facade pattern

——信息隱藏:用戶和部件的子系統(tǒng)之間解耦合,降低耦合

Controller

2. 模塊可能有附加的secrets——改變

預(yù)期的變更:把變更從模塊中分離開來,安排到新的類,方法或者設(shè)計單元中.然后封裝隔離所有的secret這樣其一旦變更,變更不會影響其他程序模塊。將要發(fā)生變化的程序部分需要進行一個決策。給出需要修改部分的接口,隱藏待修改部分的實現(xiàn)程序細節(jié)

方法:

策略模式:將算法從包含其的對象中抽離出來,封裝該算法(策略)為一個對象

裝飾模式:裝飾在不改變類的代碼的情況下擴展了一個類的實例的功能

適配器模式:將類的接口轉(zhuǎn)換成另一個client期望的接口,讓接口不兼容的類能一起工作

 如果上下文也有可變性:用橋接模式

1. 策略模式:將要變更的算法獨立出來,按照OCP的方法將其封裝起來成為一個對象,同時給這個算法建立一個繼承樹(為其設(shè)置一個接口,讓所有這個算法的可能變更的版本實現(xiàn)這個接口)

體系結(jié)構(gòu)之設(shè)計模式在設(shè)計原則中的應(yīng)用

2. 狀態(tài)模式: 對象的行為根據(jù)狀態(tài)的變化(屬性的取值變化)而變化,將變化的狀態(tài)獨立出來做成一棵繼承樹,每一個實現(xiàn)的子類都實現(xiàn)了一種狀態(tài)下的行為。原來的對象包含一 個對狀態(tài)對象的引用,表示當(dāng)前的狀態(tài),一切行為都使用這個狀態(tài)對象的行為。(需要由Context和State來處理狀態(tài)的變化,不要由Client來處 理)

體系結(jié)構(gòu)之設(shè)計模式在設(shè)計原則中的應(yīng)用

變化來源于內(nèi)部,即自己做完某件事情后把自己的狀態(tài)改掉。

3. 橋接模式:

在 抽象和實現(xiàn)需要獨立變化的情況下,將抽象和實現(xiàn)做成兩個不同的繼承樹。抽象接口和實現(xiàn)接口是兩個完全不同的接口,實現(xiàn)接口一般包含很基本、原始的方法,而 抽象接口包含的是基于原始方法實現(xiàn)的更加高級的方法。在抽象的接口中包含一個對實現(xiàn)對象的引用,抽象對象的方法中需要調(diào)用實現(xiàn)對象的方法(抽象接口的方法 基于實現(xiàn)接口的方法體系結(jié)構(gòu)之設(shè)計模式在設(shè)計原則中的應(yīng)用  

四、實現(xiàn)共性與可變性有哪些手段?

多態(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



五、中介解耦機制(在解決De-Coupling時,常常使用哪些Indirection的手段)


1)避免重復(fù)——只做一次:重復(fù)往往代表著耦合,修改一部分重復(fù)代碼表示要修改其他的

2)DIPDependency 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)事件源和注冊方法的解耦



六、運行時注冊的主要機制、適用場景與優(yōu)缺點

1、 Observer Pattern

意圖:定義對象間的一種一對多的依賴關(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)的理解和測試更加困難。
一個觀察者的無意的更新可能引起其他觀察者的意外的更新,也容易引起更更新錯誤,而這
種錯誤難以捕捉。

2、Event Style

相比Observer Pattern,可以實現(xiàn)對多個事件的監(jiān)聽。即實現(xiàn)對象間多對多的依賴關(guān)系。
其他特點同Observer Pattern

3、Command 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對象很容易。


七、特殊類型處理機制


八、對象的創(chuàng)建有哪些常見解決方法

1、簡單場景:

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、復(fù)雜場景:

(1)場景一:僅僅一個實例允許被創(chuàng)建

        使用SingletonPattern,首先將Constructor私有化;聲明一個static private的類實例;創(chuàng)建一個publicstatic的getInstance方法使得外部類可以通過此方法獲得此類實例。并且此方法如果用于多線程,要注意聲明為protected/synchronize以保證線程安全

(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


向AI問一下細節(jié)

免責(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)容。

AI