一、什么是桥接模式
桥接(Bridge)模式属于结构型设计模式。通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。把抽象(abstraction)与行为实现(implementation)分离开来,从而可以保持各部分的独立性以及应对它们的功能扩展。
二、适用场景
- 当一个类存在两个独立变化的维度,且这两个维度都需要进行扩展时
- 当一个系统不希望使用继承或因为多层次继承导致系统类的个数急剧增加时
- 当一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性时
三、代码示例
场景: 一个甜品店,售卖的食品有蛋糕、奶茶和牛奶,但是每个商品都有各种口味:草莓味、芒果味、香蕉味。
如果这时候食品又新增了拿铁,口味又新增了青提,难道要把商品和口味再全部绑定一套吗?
显然这种两个维度扩展的情况不适合这种方案。那我们另辟蹊径,创建两个父类,一个食品类一个水果类。两个父类各自包含了相应的子类,然后根据需要将食品和水果进行组合。如下:
代码:
public abstract class Food {
private Fruit fruit;
public Food(Fruit fruit) {
this.fruit = fruit;
}
public abstract void add();
}
public class Cake extends Food{
Fruit fruit1;
public Cake(Fruit fruit) {
super(fruit);
fruit1 =fruit;
}
@Override
public void add() {
fruit1.beAdd("蛋糕");
}
}
public class Milk extends Food{
Fruit fruit;
public Milk(Fruit fruit1) {
super(fruit1);
fruit = fruit1;
}
@Override
public void add() {
fruit.beAdd("牛奶");
}
}
public interface Fruit {
public void beAdd(String food);
}
public class Banana implements Fruit {
@Override
public void beAdd(String food) {
System.out.println("香蕉" + food);
}
}
public class Mango implements Fruit {
@Override
public void beAdd(String food) {
System.out.println("芒果" + food);
}
}
public class Test {
public static void main(String[] args) {
Banana banana = new Banana();
Mango mango = new Mango();
Cake cake = new Cake(banana);
cake.add();
Milk milk = new Milk(mango);
milk.add();
}
}
输出:
香蕉蛋糕
芒果牛奶