桥接模式
定义:将抽象部分与现实部分分离,是他们都可以独立地进行变化.
使用场景:
- 如果一个系统需要再构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,可以通过桥接模式使它们在抽象层上建立一个关联关系.
- 对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,可以考虑使用桥接模式.
- 一个类存在两个独立变化的维度,且这两个维度都需要进行扩展.
举个喝咖啡的例子,咖啡分为大杯和小杯,口味分为加糖不加糖,把这两个维度组合起来.
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 {
//具体要往咖啡里加什么也有之类去实现
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 端实现
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();
}
就算要是再增加一个中杯,也是按照上面的形式,进行组合,对于另一个是没有影响的,同样的,也可以增加 口味的种类,这是一样的.
网友评论