㈠意圖:
將抽象部分與它的實現部分相分離,使它們都可以獨立地變化.
- GOF 設計模式;
(二)動機:
當一個類需要在多個維度進行繼承時,會出現多個維度的不同的組合;從而導致子類數量的爆炸性增加;
例如: 人從行業屬性上進行擴展,可以分爲Programmer, Actor, Accounter等子類;
如果再加上一個維度;男和女;就變成了如下情況:
設想一個極端情況;如下Person下有10個直接子類;然後再從性別屬性進行區分就變成了要演變成10*2 = 20個子類; 更甚者;如果再從年齡層次這個屬性進行區分(老,中,青)就會達到 10*2*3 = 60個子類;顯然.當我們對抽象部分進行獨立地修改,擴充和重用時,都會對它下面的子類產生影響;
出現如此情況原因的關鍵在於繼承機制將抽象和具體的實例化進行了強綁定(繼承);解決此問題的方法就是脫耦(其實許多設計模式的關鍵就是在於用不同的方式,從不同地維度進行解耦).
在Bridge模式中;解耦的方法就是將不同維度之間的強關聯關係(繼承)改成弱關聯關係.將它們的之間的繼承關係改成聚合關係;所它們可以在不同維度相對獨立地變化)
(三) UML圖:
可以看出,這個系統含有兩個等級結構,也就是:
- 由抽象化角色和修正抽象化角色組成的抽象化等級結構。(一個維度)
- 由實現化角色和兩個具體實現化角色所組成的實現化等級結構。(另一個維度)
橋樑模式所涉及的角色包括:
- 抽象化(Abstraction)角色:抽象化給出的定義,並保存一個對實現化對象的引用。
- 修正抽象化(Refined Abstraction)角色:擴展抽象化角色,改變和修正父類對抽象化的定義。
- 實現化(Implementor)角色:這個角色給出實現化角色的接口,但不給出具體的實現。必須指出的是,這個接口不一定和抽象化角色的接口定義相同,實際上,這兩個接口可以非常不一樣。實現化角色應當只給出底層操作,而抽象化角色應當只給出基於底層操作的更高一層的操作。
- 具體實現化(Concrete Implementor)角色:這個角色給出實現化角色接口的具體實現。
聚合關係就像一個橋樑;把不同的維度關聯起來.
㈣ 場景對應:
Person:抽象化角色;
按所屬行業這一維度進行繼承: 修改抽象化角色
按性別這一維度進行擴展:實現化角色
Male, Female:具體實現化角色;
㈤ 代碼對應:
- /**
- * Bridge模式中的Implement角色(另一維度的抽象表示)
- */
- package com.skywares.designpattern.bridge;
- /**
- * @author Administrator
- *
- */
- public abstract class Gender
- {
- protected abstract void operator();
- }
- /**
- * Bridge模式中的ConcreteImplement角色(另一維度的抽象表示實現)
- */
- package com.skywares.designpattern.bridge;
- /**
- * @author Administrator
- *
- */
- public class Female extends Gender
- {
- /* (non-Javadoc)
- * @see com.skywares.designpattern.bridge.Gender#operator()
- */
- @Override
- protected void operator()
- {
- System.out.println("female");
- }
- }
- /**
- * Bridge模式中的ConcreteImplement角色(另一維度的抽象表示實現)
- */
- package com.skywares.designpattern.bridge;
- /**
- * @author Administrator
- *
- */
- public class Male extends Gender
- {
- /* (non-Javadoc)
- * @see com.skywares.designpattern.bridge.Gender#operator()
- */
- @Override
- protected void operator()
- {
- System.out.println(" male execute");
- }
- }
- /**
- * Bridge模式中的抽象角色
- */
- package com.skywares.designpattern.bridge;
- /**
- * @author Administrator
- *
- */
- public abstract class Person
- {
- private Gender gender;
- /**
- * @return the gender
- */
- public Gender getGender()
- {
- return gender;
- }
- /**
- * @param gender the gender to set
- */
- public void setGender(Gender gender)
- {
- this.gender = gender;
- }
- /**
- *
- */
- public void operator()
- {
- this.gender.operator();
- }
- }
- /**
- * Bridge角色中的 Redefined
- */
- package com.skywares.designpattern.bridge;
- /**
- * @author Administrator
- *
- */
- public class Programmer extends Person
- {
- /* (non-Javadoc)
- * @see com.skywares.designpattern.bridge.Person#operator()
- */
- @Override
- public void operator()
- {
- this.getGender().operator();
- System.out.println("programer");
- }
- }
- /**
- * 測試類
- */
- package com.skywares.designpattern.bridge;
- /**
- * @author Administrator
- *
- */
- public class Client
- {
- /**
- * @param args
- */
- public static void main(String[] args)
- {
- Person person = new Programmer();
- // 調用第一個;
- person.setGender(new Male());
- person.operator();
- // 改變另一個屬性;
- person.setGender(new Female());
- person.operator();
- }
- }