本文主要是看了《設(shè)計模式》做的筆記和思考,在此分享僅代表個人觀點疾捍,如有不對的地方歡迎批評和指正找前。
Bridge(橋接)模式
基礎(chǔ)
該模式著重解決的問題,是將整體中某個可能多變的部分抽象并分離调俘,使得需求改變時僅需改變抽象部分即可伶棒,改變后,使用方式不變脉漏。
Adapter模式用來幫助無關(guān)的類協(xié)同工作苞冯,它通常在系統(tǒng)設(shè)計完成后才會被使用。然而侧巨,Bridge模式則是在系統(tǒng)開始時就被使用,它使得抽象接口和實現(xiàn)部分可以獨立進(jìn)行改變鞭达。 ——《設(shè)計模式》
借博客園一博主的圖片一用:
重點介紹下這些組件:
- Client:使用者
- Abstraction:抽象類(其實可以直接是實體類)司忱,并且使用Implementor進(jìn)行更高級的操作
- Implement:定義接口,里面是基礎(chǔ)的操作
- ConcreteImplement:實現(xiàn)Implement中的接口
例子
拿鋼鐵俠的反應(yīng)爐舉例吧畴蹭,鋼鐵俠和他胸口的反應(yīng)爐的關(guān)系應(yīng)該如下:
public class IronMan {
private ArcReactor reactor;
private double health = 100; //假設(shè)其為100坦仍,降到0就中毒
public void setReactor(ArcReactor reactor) {
this.reactor = reactor;
}
public void use() {
double energy = reactor.getEnergy();
// do something
System.out.println("使用鋼鐵俠套裝");
health = reactor.solveScrap(health);
}
public double checkPd() {
String s = "當(dāng)前血液中鈀濃度為"+(100-health)+"%,";
String result = "";
if(health < 0) {
result = "已中毒過深";
}else if (health == 100) {
result = "健康";
}else {
result = "請盡快處理";
}
System.out.println(s+result);
return health;
}
public void reset() {
health = 100;
}
}
public interface ArcReactor {
public double getEnergy();
// 處理廢料
public double solveScrap(double body);
}
然后Tony創(chuàng)造了兩種:微型方舟反應(yīng)爐叨襟,新元素方舟反應(yīng)爐繁扎。
/**
* 微型化的方舟反應(yīng)爐
* @author Will
*/
public class MicroReactor implements ArcReactor {
private double palladium = 100; //鈀元素
private double scrap = 0;
@Override
public double getEnergy() {
palladium--;
return 30;
}
@Override
public double solveScrap(double body) {
// 廢料直接排出
scrap++;
body-=11;
return body;
}
}
public class NewElementReactor implements ArcReactor {
private double newElement = 100; //新元素
@Override
public double getEnergy() {
newElement--;
return 30;
}
@Override
public double solveScrap(double body) {
// 清潔能源無污染
return body;
}
}
使用如下:
public class Main {
public static void main(String[] args) {
IronMan tony = new IronMan();
MicroReactor oldReactor = new MicroReactor();
tony.setReactor(oldReactor);
tony.use();
tony.checkPd();
tony.reset();
System.out.println("\n換個反應(yīng)爐再來\n");
NewElementReactor newReactor = new NewElementReactor();
tony.setReactor(newReactor);
tony.use();
tony.checkPd();
}
}
結(jié)果如下:
使用鋼鐵俠套裝
當(dāng)前血液中鈀濃度為11.0%,請盡快處理
換個反應(yīng)爐再來
使用鋼鐵俠套裝
當(dāng)前血液中鈀濃度為0.0%糊闽,健康
更換反應(yīng)爐并不影響整個使用過程梳玫,而且,IronMan這個類的子類可以繼續(xù)使用右犹。
總結(jié)
Bridge模式重點在于將容易變更的部分抽象出來提澎,抽象部分的改動不影響整體的其他代碼,而且整體的子類能以相同的方式使用抽象部分念链,讓代碼更加靈活盼忌。