橋接模式
定義:將抽象部分與現(xiàn)實(shí)部分分離,是他們都可以獨(dú)立地進(jìn)行變化.
使用場(chǎng)景:
- 如果一個(gè)系統(tǒng)需要再構(gòu)件的抽象化角色和具體化角色之間增加更多的靈活性,避免在兩個(gè)層次之間建立靜態(tài)的繼承聯(lián)系,可以通過(guò)橋接模式使它們?cè)诔橄髮由辖⒁粋€(gè)關(guān)聯(lián)關(guān)系.
- 對(duì)于那些不希望使用繼承或因?yàn)槎鄬哟卫^承導(dǎo)致系統(tǒng)類的個(gè)數(shù)急劇增加的系統(tǒng),可以考慮使用橋接模式.
- 一個(gè)類存在兩個(gè)獨(dú)立變化的維度,且這兩個(gè)維度都需要進(jìn)行擴(kuò)展.
舉個(gè)喝咖啡的例子,咖啡分為大杯和小杯,口味分為加糖不加糖,把這兩個(gè)維度組合起來(lái).
public abstract class Coffee {
protected CoffeeAdditives impl;
public Coffee(CoffeeAdditives impl) {
this.impl = impl;
}
//咖啡具體是什么樣子的由子類決定
public abstract void makeCoffee();
}
public class LargeCoffee extends Coffee{
public LargeCoffee(CoffeeAdditives impl) {
super(impl);
}
@Override
public void makeCoffee() {
System.out.println("大杯的"+impl+"咖啡");
}
}
public class SmallCoffee extends Coffee{
public SmallCoffee(CoffeeAdditives impl) {
super(impl);
}
@Override
public void makeCoffee() {
System.out.println("小杯的"+impl+"咖啡");
}
}
public abstract class CoffeeAdditives {
//具體要往咖啡里加什么也有之類去實(shí)現(xiàn)
public abstract String addSomething();
}
public class Sugar extends CoffeeAdditives{
@Override
public String addSomething() {
return "加糖";
}
}
public class Ordinary extends CoffeeAdditives{
@Override
public String addSomething() {
return "原味";
}
}
Client 端實(shí)現(xiàn)
public static void main(String[] args) {
Ordinary ordinary = new Ordinary();
Sugar sugar = new Sugar();
LargeCoffee largeCoffeeOrdinary = new LargeCoffee(ordinary);
largeCoffeeOrdinary.makeCoffee();
LargeCoffee largeCoffeeSugar = new LargeCoffee(sugar);
largeCoffeeSugar.makeCoffee();
SmallCoffee smallCoffeeOrdinary = new SmallCoffee(ordinary);
smallCoffeeOrdinary.makeCoffee();
SmallCoffee smallCoffeeSugar = new SmallCoffee(sugar);
smallCoffeeOrdinary.makeCoffee();
}
就算要是再增加一個(gè)中杯,也是按照上面的形式,進(jìn)行組合,對(duì)于另一個(gè)是沒(méi)有影響的,同樣的,也可以增加 口味的種類,這是一樣的.