一,橋接模式
橋接模式:
- 一種結構型設計模式,將實現和抽象放在兩個不同的類層次中,使得兩個層次可以獨立改變;
- 基於類的最小設計原則,通過使用封裝、聚合及繼承等行爲讓不同的類承擔不同的職責,主要是 把抽象和實現分隔開來,保證各自的獨立型和功能擴展;
二,原理類圖
意圖: 將抽象部分與它的實現部分分離,使它們都可以獨立地變化。
適用性:
- 你不希望在抽象和它的實現部分之間有一個固定的綁定關係。例如這種情況可能是因爲,在程序運行時刻實現部分應可以被選擇或者切換。
- 類的抽象以及它的實現都應該可以通過生成子類的方法加以擴充。這時Bridge 模式使你可以對不同的抽象接口和實現部分進行組合,並分別對它們進行擴充。
- 對一個抽象的實現部分的修改應對客戶不產生影響,即客戶的代碼不必重新編譯。
- 有許多類要生成。這樣一種類層次結構說明你必須將一個對象分解成兩個部分。
- 你想在多個對象間共享實現(可能使用引用計數),但同時要求客戶並不知道這一點。
三,實例
左橋
package com.neei.bridge;
/**
* @param
* @Author: AaNeei
* @Date: 2019/10/7 12:59
* @Description: 遊學網
* @throws:
*/
public interface Brand {
void open();
void call();
void close();
}
左橋墩
package com.neei.bridge;
/**
* @param
* @Author: AaNeei
* @Date: 2019/10/7 13:01
* @Description: 遊學網
* @throws:
*/
public class Vivo implements Brand {
@Override
public void open() {
System.out.println("Vivo開機");
}
@Override
public void call() {
System.out.println("Vivo打電話");
}
@Override
public void close() {
System.out.println("Vivo關機");
}
}
package com.neei.bridge;
/**
* @param
* @Author: AaNeei
* @Date: 2019/10/7 13:00
* @Description: 遊學網
* @throws:
*/
public class XiaoMi implements Brand {
@Override
public void open() {
System.out.println("小米開機");
}
@Override
public void call() {
System.out.println("小米打電話");
}
@Override
public void close() {
System.out.println("小米關機");
}
}
右橋
package com.neei.bridge;
/**
* @param
* @Author: AaNeei
* @Date: 2019/10/7 13:04
* @Description: 遊學網
* @throws:
*/
public abstract class Phone {
private Brand brand;
public Phone(Brand brand) {
this.brand = brand;
}
protected void open() {
brand.open();
}
protected void call() {
brand.call();
}
protected void close(){
brand.close();
}
}
右橋墩
package com.neei.bridge;
/**
* @param
* @Author: AaNeei
* @Date: 2019/10/7 13:07
* @Description: 遊學網
* @throws:
*/
public class FolderPhone extends Phone {
public FolderPhone(Brand brand) {
super(brand);
}
@Override
protected void open() {
System.out.println("翻蓋");
super.open();
}
@Override
protected void call() {
System.out.println("翻蓋");
super.call();
}
@Override
protected void close() {
System.out.println("翻蓋");
super.close();
}
}
package com.neei.bridge;
/**
* @param
* @Author: AaNeei
* @Date: 2019/10/7 13:12
* @Description: 遊學網
* @throws:
*/
public class UpRightPhone extends Phone {
public UpRightPhone(Brand brand) {
super(brand);
}
@Override
protected void open() {
System.out.println("滑蓋");
super.open();
}
@Override
protected void call() {
System.out.println("滑蓋");
super.call();
}
@Override
protected void close() {
System.out.println("滑蓋");
super.close();
}
}
調用
package com.neei.bridge;
/**
* @param
* @Author: AaNeei
* @Date: 2019/10/7 13:13
* @Description: 遊學網
* @throws:
*/
public class Client {
public static void main(String[] args) {
Phone phone1 = new FolderPhone(new Vivo());
phone1.open();
phone1.call();
phone1.close();
System.out.println("------------------------------");
Phone phone2 = new FolderPhone(new XiaoMi());
phone2.open();
phone2.call();
phone2.close();
System.out.println("------------------------------");
Phone phone3 = new UpRightPhone(new XiaoMi());
phone3.open();
phone3.call();
phone3.close();
}
}
四,源碼分析
Mybatis源碼中使用的橋接模式,如DriverManager;