1. 程式人生 > >java設計模式5.組合模式、門面模式、享元模式、橋接模式

java設計模式5.組合模式、門面模式、享元模式、橋接模式

  • 組合模式

在面向物件的語言中,樹結構有著巨大的威力,一個基於繼承的型別的等級結構便是一個數結構,一個基於合成的物件結構也是一個數結構。組合模式將部分與整體的關係用樹結構表示出來,使得客戶端把一個個單獨的成分物件和由它們組合而成的合成物件同等看待

  • 抽象構建角色:一個抽象角色,給參加組合的物件規定一個介面,這個介面給出共有的介面及預設行為。
  • 樹葉構建角色:代表參加組合的樹葉物件,沒有子物件,定義參加組合的原始物件行為。
  • 樹枝構建角色:代表參加組合的有子物件的物件,並給出樹枝構件物件的行為。

對於子物件的管理方法如add,remove,getchild等,有兩種方式。一種是透明方式:直接定義在抽象構建角色中,這樣要求樹葉和樹枝構件都實現管理方法,但是在樹葉中是空實現。另一種是安全方式:只在樹枝構件中實現管理方法,而在樹葉構件中只實現共有的方法。

 

  • 門面模式

門面模式要求一個子系統的外部與其內部的通訊必須通過一個統一的門面物件進行。門面模式提供一個高層次的介面,使得子系統更易於使用

  • 門面角色:客戶端呼叫這個角色的方法。此角色知曉相關子系統的功能和責任,將所有客戶端的請求委派到相應的子系統。
  • 子系統角色:可以同時有一個或者多個子系統。每個子系統可以被客戶端直接或者通過門面呼叫,子系統並不感知門面的存在。

 

  • 享元模式

java中的String使用了享元模式。String物件是不變物件,即建立後不可以改變。如果要改變一個String的值,只有新建一個String物件。在JVM內部,String物件都是共享的

,如果一個系統中有兩個String物件所包含的字串相同,JVM實際上只建立了一個String物件,提供給兩個引用。從而實現String物件的共享。String.intern()方法給出這個字串在共享池中的唯一例項。

  • 抽象享元模式:所有具體享元類的超類,為這些類規定出需要實現的公共介面。
  • 具體享元角色:實現抽象享元的所有介面,物件的部分或所有狀態與所處環境無關,是的物件可以在系統內共享。
  • 享元工廠:負責建立和管理享元角色,如果已存在,則返回已有的例項。
  • 客戶端角色:維護一個對享元角色的引用,自行管理享元物件中的可變狀態,客戶端不可以直接例項化享元物件,而必須通過工廠。

 

  • 橋接模式

橋接模式的用意是通過聚合關係代替繼承將抽象化與實現化脫耦,使得二者可以獨立地變化

  • 抽象化角色:抽象化給出定義,並儲存一個對實現化物件的引用。
  • 修正抽象化角色:擴充套件抽象化角色,改變和修正父類對抽象化的定義。
  • 實現化角色:給出實現化角色的介面,但不給出具體實現。此介面只給出底層操作,而抽象化角色給出基於底層操作的更高一層操作。
  • 具體實現化角色:給出實現化角色介面的具體實現。

抽象化等級結構中的業務方法通過向對應的實現化物件委派自己的操作,這意味著抽象化角色可以通過向不同的實現化物件委派,來達到動態地轉換自己功能的目的。

大多數的驅動器都是橋接模式的應用。使用驅動程式的應用系統就是抽象化角色,而驅動器本身扮演著實現化角色。JDBC為所有的關係資料庫提供一個通用的介面。一個應用系統可以動態地選擇一個合適的驅動器,然後通過驅動器向資料庫引擎發出指令。由於JDBC驅動器的存在,應用系統可以不依賴於資料庫引擎的細節而獨立地演化,同時資料庫引擎也可以獨立於應用系統的細節而獨立演化。

#筆記內容參考《java與模式》