設計模式之擴展型模式


擴展型模式包括了:裝飾器模式、迭代器模式和訪問者模式。

1、裝飾器模式(Decorator)

        以對客戶透明的方式動態地給一個對象附加上更多的責任,裝飾者模式相比生成子類可以更靈活地增加功能。

        優點:裝飾類和被裝飾類可以獨立發展,不會相互耦合,裝飾模式是繼承的一個替代模式,裝飾模式可以動態擴展一個實現類的功能。

        缺點:多層裝飾比較復雜。

       使用場景: 1、擴展一個類的功能。 2、動態增加功能,動態撤銷。 

       實現過程

              實現的核心步驟:創建裝飾器繼承於裝飾對象的抽象類,實現裝飾器抽象類,在實體裝飾器里添加新的功能,這里要注意的是,裝飾器里必須傳入你要裝飾的對象,這樣才知道你要裝飾的是“誰”;

              調用:通過裝飾器調用被裝飾對象的方法同時也調用了裝飾器里新加的功能。

       舉個栗子:給單一的手機功能擴展其它的功能。

       第一步:創建手機抽象類

        

        第二步:創建手機實體類(繼承手機抽象類)

        

        第三步:創建裝飾器抽象類(繼承手機抽象類,這樣才能給手機添加裝飾)

       

       第四步:創建裝飾實體類(繼承裝飾器抽象類)

       

       

       最后:實現擴展功能

       

       輸出:

       

 2、 迭代器模式(Iterator)

       迭代器模式提供了一種方法順序訪問一個聚合對象(理解為集合對象)中各個元素,而又無需暴露該對象的內部表示,這樣既可以做到不暴露集合的內部結構,又可讓外部代碼透明地訪問集合內部的數據。

       優點: 1、它支持以不同的方式遍歷一個聚合對象。 2、迭代器簡化了聚合類。 3、在同一個聚合上可以有多個遍歷。 4、在迭代器模式中,增加新的聚合類和迭代器類都很方便,無須修改原有代碼。

       缺點:由於迭代器模式將存儲數據和遍歷數據的職責分離,增加新的聚合類需要對應增加新的迭代器類,類的個數成對增加,這在一定程度上增加了系統的復雜性。使用foreach語句只能在對集合進行遍歷,不能在遍歷的同時更改集合中的元素。

       實現過程

              實現的核心步驟:創建迭代器實體類繼承於迭代器抽象類,在迭代器里必須有需要遍歷的集合對象,並且自定義的集合對象里需要獲取到迭代器才能進行迭代遍歷;

              調用:創建的迭代器對象通過集合對象獲取迭代器實例,再通過迭代器遍歷集合。

       舉個栗子:創建一個迭代器去遍歷自定義的集合

       第一步:創建迭代器抽象類或者接口

       

       第二步:創建迭代器實體類

       

       第三步:創建集合抽象類或者接口

       

       第四步:創建聚合實體類

       

       最后:使用迭代器對集合對象進行變量

       

       輸出:

       

3、訪問者模式(Visitor)

       表示一個作用於某對象結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作。主要將數據結構與數據操作分離。

       優點: 1、符合單一職責原則。 2、優秀的擴展性。 3、靈活性。

       缺點: 1、具體元素對訪問者公布細節,違反了迪米特原則。 2、具體元素變更比較困難。 3、違反了依賴倒置原則,依賴了具體類,沒有依賴抽象。

       使用場景: 1、對象結構中對象對應的類很少改變,但經常需要在此對象結構上定義新的操作。 2、需要對一個對象結構中的對象進行很多不同的並且不相關的操作,而需要避免讓這些操作"污染"這些對象的類,也不希望在增加新操作時修改這些類。

       實現過程

              實現的核心步驟:創建的被訪問實體類需要接受訪問者,而訪問者的訪問方法里需要傳入被訪問實體對象,在訪問者里面擴展被訪問者的功能;

              調用:創建訪問者實例,傳入到被訪問者實例,再通過被訪者調用。

       舉個栗子:

       第一步:創建一個表示抽象類

       

       第二步:創建表示抽象類的實體類

       

       

       第三步:創建訪問者抽象類或者接口

       

        第四步:創建訪問者實體類

       

       最后:調用訪問者擴展表示元素的功能

      

      輸出:

      

      上面的表示元素本來只有一個Accept(引入訪問者)這一個方法,然而通過訪問者,可以在訪問者實體類里面擴展了輸出的功能(當然也可以是其它的)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM