停止不了的執行緒-T1111
0x01:橋接模式簡介
橋接模式是將抽象部分與它的實現部分分離,使它們都可以獨立地變化,而不會直接影響到其他部分。是一種物件結構型模式,又稱介面(interface)模式。UML類圖如下:
主要角色如下:
Implementor:實現化角色,它是介面或者抽象類,定義角色必需的行為和屬性;這個介面不一定要與Abstraction的介面完全一致,事實上這兩個介面可以完全不同,一般而言,Implementor介面僅提供基本操作,而Abstraction定義的介面可能會做更多更復雜的操作。Implementor介面對這些基本操作進行了宣告,而具體實現交給其子類。通過關聯關係,Abstraction不僅擁有自己的方法,還可以呼叫Implementor中定義的方法,使用關聯關係來替代繼承關係;
ConcreteImplementor:具體實現化角色,實現介面或抽象類定義的方法或屬性。在不同的ConcreteImplementor中提供基本操作的不同實現,在程式執行時,ConcreteImplementor物件將替換其父類物件,提供給抽象類具體的業務操作方法;
Abstraction:抽象化角色,定義出該角色的行為,同時儲存一個對實現化角色的引用;它一般是抽象類而不是介面,其中定義了一個Implementor(實現類介面)型別的物件並可以維護該物件,它與Implementor之間具有關聯關係,它既可以包含抽象業務方法,也可以包含具體業務方法;
RefinedAbstraction:擴充抽象類角色,引用實現化角色對抽象化角色進行擴充。通常情況下,它不再是抽象類而是具體類,它實現了在Abstraction中宣告的抽象業務方法,在RefinedAbstraction中可以呼叫在Implementor中定義的業務方法;
0x02:橋接模式典型實現
Implementor抽象類
public abstract class Implementor {
public abstract void operatorA();
public abstract void operatorB();
}
ConcreteImplementor:這裡可以編寫多個具體實現類
public class ConcreteImplementorA extends Implementor { @Override public void operatorA() { System.out.println("具體實現ConcreteImplementorA的operatorA執行"); } @Override public void operatorB() { System.out.println("具體實現ConcreteImplementorA的operatorB執行"); } } public class ConcreteImplementorB extends Implementor { @Override public void operatorA() { System.out.println("具體實現ConcreteImplementorB的operatorA執行"); } @Override public void operatorB() { System.out.println("具體實現ConcreteImplementorB的operatorB執行"); } }
Abstraction抽象類
public abstract class Abstraction {
private Implementor implementor;
//約束子類必須實現該建構函式
public Abstraction(Implementor implementor) {
this.implementor = implementor;
}
public Implementor getImplementor() {
return implementor;
}
//自身的行為和屬性
public void request() {
//TODO 可以新增操作
}
}
RefinedAbstraction
public class RefinedAbstraction extends Abstraction {
//覆寫建構函式
public RefinedAbstraction(Implementor implementor) {
super(implementor);
}
//修正父類行為
@Override
public void request() {
super.request();
super.getImplementor().operatorA();
}
}
橋接模式測試程式碼
public class Client {
public static void main(String[] args) {
Implementor implementor1 = new ConcreteImplementorA();
Abstraction abstraction1 = new RefinedAbstraction(Implementor1);
abstraction1.request();
Implementor implementor2 = new ConcreteImplementorB();
Abstraction abstraction2 = new RefinedAbstraction(Implementor2);
abstraction2.request();
}
}
0x03:橋接模式的應用場景
因為橋接模式又稱介面模式,所以可以理解為提供一個標準介面,然後多種實現。這種場景在專案開發中,在普遍不過了。
- 預警系統的資訊處理方式
一般預警系統都提供了訊息通知的功能,而訊息通知的渠道多種多樣,主要有站內訊息、郵件訊息和簡訊訊息。
- 多廠商對接
在做專案時,經常遇到一個同樣的功能對接多個廠商的情況。這種情況普遍存在裝置對接的專案中,之前小編在做櫃面系統時,經常遇到刷卡器、身份證讀取器等裝置同時對接多個廠商的情況。
- 日誌框架
java領域的日誌框架,介面定義與具體實現框架。常常也是基於橋接模式實現適配使用的。
橋接模式的使用場景
-
一個類存在兩個獨立變化的維度,且這兩個維度都需要進行擴充套件;
-
不希望使用繼承或因為多層次繼承導致系統類的個數急劇增加的系統 ;
-
如果一個系統需要在構件的抽象化角色和具體化角色之間增加更多的靈活性,避免在兩個層次之間建立靜態的繼承聯絡,通過橋接模式可以使它們在抽象層建立一個關聯關係;