Java設計模式 – 橋接模式與策略模式的區別

來源:互聯網
上載者:User

[轉載自:http://www.blogjava.net/wangle/archive/2007/04/25/113545.html]

橋接(Bridge)模式是結構型模式的一種,而策略(strategy)模式則屬於行為模式。以下是它們的UML結構圖。

在橋接模式中,Abstraction通過彙總的方式引用Implementor。

 

在策略模式中,Context也使用彙總的方式引用Startegy抽象介面。

 

從他們的結構圖可知,在這兩種模式中,都存在一個對象使用彙總的方式引用另一個對象的抽象介面的情況,而且該抽象介面的實現可以有多種並且可以替換。可以說兩者在表象上都是調用者與被調用者之間的解耦,以及抽象介面與實現的分離。

那麼兩者的區別體現在什麼地方呢?

1. 首先,在形式上,兩者還是有一定區別的,對比兩幅結構圖,我們可以發現,在橋接模式中不僅Implementor具有變化(ConcreateImplementior),而且Abstraction也可以發生變化(RefinedAbstraction),而且兩者的變化是完全獨立的,RefinedAbstraction與ConcreateImplementior之間鬆散耦合,它們僅僅通過Abstraction與Implementor之間的關係聯絡起來。而在策略模式中,並不考慮Context的變化,只有演算法的可替代性。

2. 其次在語意上,橋接模式強調Implementor介面僅提供基本操作,而Abstraction則基於這些基本操作定義更高層次的操作。而策略模式強調Strategy抽象介面的提供的是一種演算法,一般是無狀態、無資料的,而Context則簡單調用這些演算法完成其操作。

3. 橋接模式中不僅定義Implementor的介面而且定義Abstraction的介面,Abstraction的介面不僅僅是為了與Implementor通訊而存在的,這也反映了結構型模式的特點:通過繼承、彙總的方式組合類別和對象以形成更大的結構。在策略模式中,Startegy和Context的介面都是兩者之間的協作介面,並不涉及到其它的功能介面,所以它是行為模式的一種。行為模式的主要特點就是處理的是對象之間的通訊方式,往往是通過引入中介者對象將通訊雙方解耦,在這裡實際上就是將Context與實際的演算法提供者解耦。

所以相對策略模式,橋接模式要表達的內容要更多,結構也更加複雜。橋接模式表達的主要意義其實是介面隔離的原則,即把本質上並不內聚的兩種體系區別開來,使得它們可以鬆散的組合,而策略在解耦上還僅僅是某一個演算法的層次,沒有到體系這一層次。從結構圖中可以看到,策略的結構是包容在橋接結構中的,橋接中必然存在著策略模式,Abstraction與Implementor之間就可以認為是策略模式,但是橋接模式一般Implementor將提供一系列的成體系的操作,而且Implementor是具有狀態和資料的靜態結構。而且橋接模式Abstraction也可以獨立變化。

 

參考:呂震宇的設計模式隨筆——蠟筆與毛筆的故事

Bridge Strategy 和State的區別 後續的討論,很有啟發。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.