桥接模式 Bridge Pattern
将抽象部分与实现部分分离,使它们都可以独立的变化。
小明的披萨外卖店生意越来越好,制作披萨的速度已经赶不上订单的速度,小明决定买几台自动披萨机来代替人工。
一番考察后,M品牌的披萨机和符合小明的需求。它有制作不同口味的多种机器,每种机器都可以更换大中小三种烤箱,分别烤出12寸、9寸和6寸的披萨。以后如果有新口味的要求,再买一台新披萨机就可以,原来的烤箱还能用。如果想新做新的尺寸,另外购买烤箱,原来的机器直接可以用。
这个设计真是不错,小明心想,两个维度各自变化,互不影响,极大提高了扩展性,这就是软件开发中的桥接模式啊。
UML图:
代码:
public interface Oven {
String bake();
}
public class BigOven implements Oven {
@Override
public String bake() {
return "12寸";
}
}
public class MiddleOven implements Oven {
@Override
public String bake() {
return "9寸";
}
}
public class SmallOven implements Oven {
@Override
public String bake() {
return "6寸";
}
}
public abstract class PizzaMachine {
protected Oven oven;
public void setOven(Oven oven) {
this.oven = oven;
}
public abstract String bake();
}
public class SeafoodPizzaMachine extends PizzaMachine {
@Override
public String bake() {
return oven.bake() + "海鲜披萨";
}
}
public class FruitsPizzaMachine extends PizzaMachine {
@Override
public String bake() {
return oven.bake() + "水果披萨";
}
}
客户端:
public class Client {
public static void main(String[] args) {
PizzaMachine pizzaMachine = new SeafoodPizzaMachine();
pizzaMachine.setOven(new BigOven());
System.out.println(pizzaMachine.bake());
pizzaMachine.setOven(new SmallOven());
System.out.println(pizzaMachine.bake());
pizzaMachine = new FruitsPizzaMachine();
pizzaMachine.setOven(new MiddleOven());
System.out.println(pizzaMachine.bake());
}
}
12寸海鲜披萨
6寸海鲜披萨
9寸水果披萨
桥接模式的核心是使用合成代替继承。