?程序員小名去擺攤賣奶茶了,口味有香、甜。 型號有大、中、小。假如小名先在家里把這些奶茶裝好,那么最少要裝2x3 = 6杯奶茶,如果此時新增一個口味:酸,那么就需要多裝3杯奶茶了。而且這樣做,等客戶買走一種,比如 甜+大杯后,這種型號就沒有了,這樣擴(kuò)展性不太行哦。
換種方案:擺攤的時候只要帶兩樣?xùn)|西:1)不同口味的飲料;2)不同型號的杯子。 那么就可以不要先再家裝好,客戶想買什么,臨時裝好就行了,而且就算新增一個口味,那么也只是多準(zhǔn)備一種飲料而已,而不是要增加三種類型。
第二種方案就算本文講的橋接模式,“客戶點奶茶口味及型號,小名臨時裝”的這個動作就是“橋”,將口味與杯子型號連接起來。
1 橋接模式概述
如果軟件系統(tǒng)種某個類存在兩個或以上變化的維度,通過該模式可以將這些維度分離處理,使兩者可以獨立擴(kuò)展,讓系統(tǒng)更加符合單一職責(zé)原則。將獨立的維度設(shè)計為不同的繼承等級接口,并在抽象層建立一個抽象關(guān)聯(lián),該關(guān)聯(lián)類似一條連接這些獨立繼承結(jié)構(gòu)的橋。
圖 橋接模式結(jié)構(gòu)圖
Abstraction,抽象類,一般是抽象類而不是接口,既可包含抽象業(yè)務(wù)方法,也可以包含具體業(yè)務(wù)方法。做更多、更復(fù)雜的操作。定義了一個Implementor類型的對象并可維護(hù)該對象。
RefinedAbstraction,擴(kuò)充抽象類,實現(xiàn)了在Abstraction中聲名的抽象業(yè)務(wù)方法。可以調(diào)用在Implementor中定義的業(yè)務(wù)方法。
Implementor,實現(xiàn)類接口,接口不一定要與Abstraction的接口完全一致,僅提供基本操作。
ConcreteImplementor,具體實現(xiàn)類,實現(xiàn)Implementor基本操作接口。
public abstract class MilkTeaAbstraction {
protected CupImplementor cupImplementor;
public MilkTeaAbstraction(CupImplementor cupImplementor) {
this.cupImplementor = cupImplementor;
}
public abstract void taste(); //口味
}
public class FragrantMilkTea extends MilkTeaAbstraction{
public FragrantMilkTea(CupImplementor cupImplementor) {
super(cupImplementor);
}
@Override
public void taste() {
System.out.println("香 " + cupImplementor.model() + ";");
}
}
public class AcidMilkTea extends MilkTeaAbstraction{
public AcidMilkTea(CupImplementor cupImplementor) {
super(cupImplementor);
}
@Override
public void taste() {
System.out.println("酸 " + cupImplementor.model() + ";");
}
}
public interface CupImplementor {
String model(); //型號
}
public class BigCupImplementor implements CupImplementor{
@Override
public String model() {
return "大杯";
}
}
public class SmallCupImplement implements CupImplementor{
@Override
public String model() {
return "小杯";
}
}
public class Client {
public static void main(String[] args) {
CupImplementor cupImplementor = new BigCupImplementor();
MilkTeaAbstraction milkTeaAbstraction = new FragrantMilkTea(cupImplementor);
milkTeaAbstraction.taste();
// 運(yùn)行結(jié)果:
// 香 大杯;
}
}
2 優(yōu)缺點
優(yōu)點:文章來源:http://www.zghlxwxcb.cn/news/detail-604415.html
- 用“對象間的關(guān)聯(lián)關(guān)系”解耦抽象和實現(xiàn)之間固有的綁定關(guān)系,使得抽象和實現(xiàn)可沿著各自的維度來變化。即抽象和實現(xiàn)不再在同一個繼承層次結(jié)構(gòu)中。
- 提供了系統(tǒng)的可擴(kuò)展性,在兩個維度中任意擴(kuò)展一個維度,都不需要修改原有系統(tǒng),符合開閉原則。
缺點:文章來源地址http://www.zghlxwxcb.cn/news/detail-604415.html
- 增加系統(tǒng)的理解和設(shè)計難度,要求開發(fā)者一開始就針對抽象層進(jìn)行設(shè)計與編程。
- 要求正確識別出系統(tǒng)中兩個獨立變化的維度,如果識別這兩個維度也需要一定的經(jīng)驗積累。
3 適用場景
- 一個類存在兩個(或多個)獨立變化的維度,且這些維度都需要獨立進(jìn)行擴(kuò)展。
- 不希望使用繼承或因為多層繼承導(dǎo)致系統(tǒng)類的個數(shù)急劇增加的系統(tǒng)。
到了這里,關(guān)于橋接模式-處理多維度變化的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!