Java設計模式之橋接模式
阿新 • • 發佈:2019-02-15
合成/聚合複用原則:儘量使用合成/聚合,儘量不要使用類繼承。聚合表示一種弱的 ‘擁有’ 關係,體現A物件可以包含B物件,但B物件不是A物件的一部分;合成則是一種強的‘擁有’ 關係,體現了嚴格的部分和整體的關係,部分和整體的生命週期一樣,比方說雁有兩個翅膀,翅膀與大雁是部分與整體的關係,並且它們的生命週期是相同的,於是大雁和翅膀就是合成關係,而大雁是群居動物,所以每隻大雁都是屬於一個雁群,一個雁群可以有多隻大雁,所以大雁和雁群是聚合關係。
橋接模式(Bridge):將抽象部分與它的實現部分分離,使他們都可以獨立地變化。
實現類:
抽象類:public abstract class Implementor { public abstract void operation(); } class ConcreteImplemtorA extends Implementor { @Override public void operation() { System.out.println("ConcreteImplemtorA的方法執行"); } } class ConcreteImplemtorB extends Implementor { @Override public void operation() { System.out.println("ConcreteImplemtorB的方法執行"); } }
客戶端:public abstract class Abstraction { protected Implementor implementor;// 橋接模式的關鍵,使得Abstraction聚合Implementor private String name; public Abstraction(String name) { this.setName(name); } public void setImplementor(Implementor implementor) { this.implementor = implementor; } public void operation() { System.out.print("Abstraction-" + this.getName() + ": "); implementor.operation(); } public String getName() { return name; } public void setName(String name) { this.name = name; } } class AbstractionA extends Abstraction { public AbstractionA(String name) { super(name); } @Override public void operation() { super.operation(); } } class AbstractionB extends Abstraction { public AbstractionB(String name) { super(name); } @Override public void operation() { super.operation(); } }
執行結果:public class BridgeClient {//客戶端 public static void main(String[] args) { Abstraction a = new AbstractionA("A"); a.setImplementor(new ConcreteImplemtorA()); a.operation(); a.setImplementor(new ConcreteImplemtorB()); a.operation(); Abstraction b = new AbstractionB("B"); b.setImplementor(new ConcreteImplemtorA()); b.operation(); b.setImplementor(new ConcreteImplemtorB()); b.operation(); // 這樣通過使用“組合/聚合複用原則” // 如果繼續有AbstractionC ... 或者ConcreteImplemtorC ... // 只需要擴充套件類即可,不需要修改現有類,符合“開放-封閉”原則 } }
Abstraction-A: ConcreteImplemtorA的方法執行
Abstraction-A: ConcreteImplemtorB的方法執行
Abstraction-B: ConcreteImplemtorA的方法執行
Abstraction-B: ConcreteImplemtorB的方法執行
可以把每個分類獨立粗來,讓它們各自變化,再使用聚合關係將它們聯絡起來。這種模式就是聚合模式。
應用場合:
當實現系統可能有多個角度分類,每一種分類都有可能變化,那麼就把這種多角度分離出來讓它們獨立變化,減少它們之間的耦合,也就是說,在發現我們需要多角度去分類實現物件的時候,就應該考慮用橋接模式了。