㈠意圖:設計模式
將抽象部分與它的實現部分相分離,使它們均可以獨立地變化.ide
(二)動機:測試
當一個類須要在多個維度進行繼承時,會出現多個維度的不一樣的組合;從而致使子類數量的爆炸性增長;this
例如: 人從行業屬性上進行擴展,能夠分爲Programmer, Actor, Accounter等子類;spa
若是再加上一個維度;男和女;就變成了以下狀況:設計
設想一個極端狀況;以下Person下有10個直接子類;而後再從性別屬性進行區分就變成了要演變成10*2 = 20個子類; 更甚者;若是再從年齡層次這個屬性進行區分(老,中,青)就會達到 10*2*3 = 60個子類;顯然.當咱們對抽象部分進行獨立地修改,擴充和重用時,都會對它下面的子類產生影響;對象
出現如此狀況緣由的關鍵在於繼承機制將抽象和具體的實例化進行了強綁定(繼承);解決此問題的方法就是脫耦(其實許多設計模式的關鍵就是在於用不一樣的方式,從不一樣地維度進行解耦).繼承
在Bridge模式中;解耦的方法就是將不一樣維度之間的強關聯關係(繼承)改爲弱關聯關係.將它們的之間的繼承關係改爲聚合關係;所它們能夠在不一樣維度相對獨立地變化)接口
(三) UML圖:get
能夠看出,這個系統含有兩個等級結構,也就是:
橋樑模式所涉及的角色包括:
聚合關係就像一個橋樑;把不一樣的維度關聯起來.
㈣ 場景對應:
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();
- }
- }