一、橋接模式介紹
基本介紹
1)橋接模式是指:將實現與抽象放在兩個不同的類層次中,使兩個層次可以獨立改變;
2)是一種結構型設計模式;
3)Bridge模式基於類的最小設計原則,通過使用封裝、聚合及繼承等行爲讓不同的類承擔不同的職責。它的主要特點是把抽象(Abstraction)與行爲實現(Implementation)分離開來,從而可以保持各部分的獨立性以及應對他們的功能擴展。
橋接模式原理類圖
原理類圖說明:
1)Client類:橋接模式的調用者;
2)抽象類(Abstraction):維護Implementor/即它的實現類ConcreteImplementorA…,二者是聚合關係,Abstraction充當橋接類;
3)RefinedAbstraction:是Abstraction抽象類的子類;
4)Implementor:行爲實現類的接口;
5)ConcreteImplementorA/B:行爲的具體實現類;
6)從UML圖:這裏的抽象類和接口是聚合的關係,其實調用和被調用關係。
橋接模式注意事項和細節
1)實現了抽象和實現部分的分離,從而極大的提供了系統的靈活性,讓抽象部分和實現部分獨立開來,這有助於系統進行分層設計,從而產生更好的結構化系統;
2)對於系統的高層部分,只需要知道抽象部分和實現部分的接口就可以了,其他的部分由具體業務來完成;
3)橋接模式替代多層繼承方案,可以減少子類的個數,降低系統的管理和維護成本;
4)橋接模式的引入增加了系統的理解和設計難度,由於聚合關聯關係建立在抽象層,要求開發者針對抽象層進行設計和編程;
5)橋接模式要求正確識別出系統中兩個獨立變化的維度,因此其使用範圍有一定的侷限性,即需要有這樣的應用場景。
橋接模式其他應用場景
1)對於那些不希望使用繼承或因爲多層繼承導致系統類的個數急劇增加的系統,橋接模式尤爲使用;
2)常見的應用場景:
- JDBC驅動程序
- 銀行轉賬系統
轉賬分類:網上轉賬,櫃檯轉賬,ATM轉賬(抽象層)
轉賬用戶類型:普通用戶,銀卡用戶,金卡用戶等(實現層) - 消息管理
消息類型:即時消息,延時消息等(抽象層)
消息分類:手機短信,郵件消息,QQ消息等(實現層)
二、應用
- 橋接模式應用實例
假設有不同品牌的手機,而且都有打電話、開機關機的功能,而每個品牌下的手機都有各種樣式型號的手機。實現增加某一個品牌或者增加某一個樣式的手機時,只需增加少量的類。如下圖傳統的方案,每新增一個品牌的手機或者新增一個樣式的手機,都要新增好幾個類。
- 類圖
- 代碼
1)品牌接口類
//接口
public interface Brand {
public void open();
public void close();
public void call();
}
2)具體品牌子類
public class Vivo implements Brand{
public void open() {
System.out.println("Vivo手機開機");
}
public void close() {
System.out.println("Vivo手機關機");
}
public void call() {
System.out.println("Vivo手機打電話");
}
}
public class XiaoMi implements Brand{
public void open() {
System.out.println("小米手機開機");
}
public void close() {
System.out.println("小米手機關機");
}
public void call() {
System.out.println("小米手機打電話");
}
}
3)抽象樣式手機類
public abstract class Phone {
//組合品牌
private Brand brand;
//構造器
public Phone(Brand brand) {
this.brand = brand;
}
protected void open(){
this.brand.open();
}
protected void close(){
this.brand.close();
}
protected void call(){
this.brand.call();
}
}
4)具體樣式手機類
//摺疊式手機類,繼承抽象類Phone
public class FoldedPhone extends Phone{
//構造器
public FoldedPhone(Brand brand) {
super(brand);
}
public void open(){
super.open();
System.out.println("摺疊樣式手機");
}
public void close(){
super.close();
System.out.println("摺疊樣式手機");
}
public void call(){
super.close();
System.out.println("摺疊樣式手機");
}
}
//旋轉式手機類,繼承抽象類Phone
public class UpRightPhone extends Phone{
public UpRightPhone(Brand brand) {
super(brand);
}
public void open(){
super.open();
System.out.println("直立樣式手機");
}
public void close(){
super.close();
System.out.println("直立樣式手機");
}
public void call(){
super.close();
System.out.println("直立樣式手機");
}
}
5)客戶端類’
public class Client {
public static void main(String[] args) {
//獲取摺疊式手機(樣式+品牌)
Phone phone1 = new FoldedPhone(new XiaoMi());
phone1.open();
phone1.call();
phone1.close();
System.out.println("===============");
Phone phone2 = new FoldedPhone(new Vivo());
phone2.open();
phone2.call();
phone2.close();
System.out.println("===============");
Phone phone3 = new UpRightPhone(new Vivo());
phone3.open();
phone3.call();
phone3.close();
}
}