
当一个类内部具备两种或多种变化维度时,使用桥接模式可以解耦这些变化的维度,使高层代码架构稳定。
桥接模式通常适用于以下场景。
桥接模式的一个常见使用场景就是替换继承。我们知道,继承拥有很多优点,比如,抽象、封装、多态等,父类封装共性,子类实现特性。继承可以很好的实现代码复用(封装)的功能,但这也是继承的一大缺点。
因为父类拥有的方法,子类也会继承得到,无论子类需不需要,这说明继承具备强侵入性(父类代码侵入子类),同时会导致子类臃肿。因此,在设计模式中,有一个原则为优先使用组合/聚合,而不是继承。
public interface CoffeeAdditives {
String addSomething();
}
复制代码
public class Milk implements CoffeeAdditives{
@Override
public String addSomething() {
return "牛奶";
}
}
public class Sugar implements CoffeeAdditives {
@Override
public String addSomething() {
return "加糖";
}
}
复制代码
public abstract class Coffee {
protected CoffeeAdditives mCoffeeAdditives;
public Coffee(CoffeeAdditives coffeeAdditives) {
mCoffeeAdditives = coffeeAdditives;
}
abstract void makeCoffee();
}
复制代码
public class SmallCoffee extends Coffee {
public SmallCoffee(CoffeeAdditives coffeeAdditives) {
super(coffeeAdditives);
}
@Override
void makeCoffee() {
System.out.println("制作小杯" +mCoffeeAdditives.addSomething()+ "咖啡");
}
}
public class MiddleCoffee extends Coffee {
public MiddleCoffee(CoffeeAdditives coffeeAdditives) {
super(coffeeAdditives);
}
@Override
void makeCoffee() {
System.out.println("制作中杯" + mCoffeeAdditives.addSomething() + "咖啡");
}
}
public class LargeCoffee extends Coffee {
public LargeCoffee(CoffeeAdditives coffeeAdditives) {
super(coffeeAdditives);
}
@Override
void makeCoffee() {
System.out.println("制作大杯" + mCoffeeAdditives.addSomething() + "咖啡");
}
}
复制代码
public class MakeCoffeeTest {
@Test
public void makeCoffee() {
new SmallCoffee(new Milk()).makeCoffee();
new SmallCoffee(new Sugar()).makeCoffee();
new MiddleCoffee(new Milk()).makeCoffee();
new MiddleCoffee(new Sugar()).makeCoffee();
new LargeCoffee(new Milk()).makeCoffee();
new LargeCoffee(new Sugar()).makeCoffee();
}
}
制作小杯牛奶咖啡
制作小杯加糖咖啡
制作中杯牛奶咖啡
制作中杯加糖咖啡
制作大杯牛奶咖啡
制作大杯加糖咖啡