設計模式之--橋接模式
橋接模式--導讀
我們應該都看過西遊記吧,畢竟這是大家童年的經典。想必你一定見過這麽一幕天蓬元帥犯了錯誤,而被罰投胎為豬身,此時,雖然天蓬元帥的靈魂沒有變,但是身體卻變成的豬身體。假如這個豬的身體是玉帝親手造的,而且只能使用一次。但是這時玉帝又不想讓天蓬元帥變成豬身,想讓他變成馬身,這時他又要造一個馬身來懲罰,但是存在一個問題,天庭中不止有一個人犯錯,而是有很多人犯錯,玉帝要對他們進行相應的懲罰,變成不同的身體,這就需要玉帝不停的建造身體,然後將他們的靈魂放進去。所以玉帝就想出了一個辦法,那就是建造一個投胎的地方,當玉帝想罰他們變成什麽動物的時候就,僅僅需要將他們送到對應的地方投胎即可,當玉帝突發奇想,想新加一個新的懲罰方式時,僅需要新建一個投胎地點即可。而不需要頻繁的建造身體。
這便是橋接模式:
橋接模式使得抽象部分和實例部分之間分離,使得他們之間可以獨立變化,將繼承關系轉化為關聯關系,降低了類與類之間的耦合度,減少了類的數量同時也減少了代碼量。
橋接模式--定義
由上面的導讀我們可以知道:
橋接(Bridge)是用於把抽象化與實現化解耦,使得二者可以獨立變化。這種類型的設計模式屬於結構型模式,它通過提供抽象化和實現化之間的橋接結構,來實現二者的解耦。
這種模式涉及到一個作為橋接的接口,使得實體類的功能獨立於接口實現類。這兩種類型的類可被結構化改變而互不影響。
其中抽象化:是將各個具有相同的屬性的事物抽象為一個具體的類,例子中的神和身體便是抽象類。
實現化指的是:將抽象出來的屬性變成具體的事物,就是例子中的懲罰產生的東西。
橋接模式--結構
下圖是橋接模式的UML結構圖:
橋接模式主要包含如下幾個角色:
Abstraction:抽象類。
RefinedAbstraction:擴充抽象類。
Implementor:實現類接口。
ConcreteImplementor:具體實現類 。
橋接模式--代碼實現
god.java
package Bridge_Pattren; /** * 要懲罰的神 * @author xyxy001 **/ public abstract class God { //在god中要留下對body的引用 public Body body; //神的名字 public String name; //神的職位 public String job; //性別 public String sex; public void setBody(Body body){ this.body=body; } public abstract void rencarnation(); }
Body.java
package Bridge_Pattren; /** * 要罰成投胎的地方 * @author xyxy001 * */ public interface Body { public void doRencarnation(String GodName); }
package Bridge_Pattren; public class MokeySun extends God { public MokeySun(String name,String job,String sex){ this.name=name; this.job=job; this.sex=sex; } public void rencarnation() { body.doRencarnation(name); } }
dog.java具體投胎的地方
package Bridge_Pattren; /** * 投狗胎的地方 * @author xyxy001 * */ public class Dog implements Body { public void doRencarnation(String GodName) { System.out.println(GodName+":投胎狗身"); } }
horse.java
package Bridge_Pattren; public class Horse implements Body{ @Override public void doRencarnation(String GodName) { System.out.println(GodName+":投胎馬身"); } }
client.java用於模擬玉帝
package Bridge_Pattren; public class Client { public static void main(String args[]){ MokeySun mokeysun=new MokeySun("孫悟空","養馬","男"); //玉帝讓孫悟空投狗胎 Body body=new Dog(); //投馬胎 Body body2=new Horse(); mokeysun.setBody(body); mokeysun.rencarnation(); mokeysun.setBody(body2); mokeysun.rencarnation(); } }
運行效果
橋接模式--優缺點
優點:
1、分離抽象接口及其實現部分。提高了比繼承更好的解決方案。
2、橋接模式提高了系統的可擴充性,在兩個變化維度中任意擴展一個維度,都不需要修改原有系統。
3、實現細節對客戶透明,可以對用戶隱藏實現細節。
缺點
1、橋接模式的引入會增加系統的理解與設計難度,由於聚合關聯關系建立在抽象層,要求開發者針對抽象進行設計與編程。
2、橋接模式要求正確識別出系統中兩個獨立變化的維度,因此其使用範圍具有一定的局限性。
橋接模式--使用場景
1、如果一個系統需要在構件的抽象化角色和具體化角色之間增加更多的靈活性,避免在兩個層次之間建立靜態的繼承聯系,通過橋接模式可以 使它們在抽象層建立一個關聯關系。
2、對於那些不希望使用繼承或因為多層次繼承導致系統類的個數急劇增加的系統,橋接模式尤為適用。
3、一個類存在兩個獨立變化的維度,且這兩個維度都需要進行擴展。
設計模式之--橋接模式