桥接模式(Bridge)是一种结构型设计模式。
定义:
桥接模式将抽象部分与实现部分分离,使他们都可以独立的进行变化。
主要特点:
把抽象(Abstraction)与行为实现(Implementation)分离开来,从而可以保持各部分的独立性以及应对他们的功能扩展。
桥接模式的UML图如下:
桥接模式的角色和职责:
1. Client 调用端
这是Bridge模式的调用者。
2. 抽象类(Abstraction)
抽象类接口(接口这货抽象类)维护队行为实现(implementation)的引用。它的角色就是桥接类。
3. Refined Abstraction
这是Abstraction的子类。
4. Implementor
行为实现类接口(Abstraction接口定义了基于Implementor接口的更高层次的操作)。
Implementor定义实现部分的接口,该接口不一定要与Abstraction的接口完全一致,事实上这两个接口可以完全不同。一般来说,Implementor接口仅提供基本操作,而Abstraction则定义基于这些基本操作的较高层次的操作。
5. ConcreteImplementor
Implementor的子类。
使用场景
举个栗子
注意:这里的抽象部分和实现部分只是两个独立变化的维度,独立变化。
我们平常喝咖啡的时候分别有大杯小杯的,还有加糖和不加糖的,这两种变化时独立变化的,互不影响。我们把大杯小杯作为抽象部分,加不加糖作为实现部分。
抽象部分:
public abstract class Coffee {
protected CoffeeAdditives coffeeAdditives;//持有CoffeeAdditives的引用,方便调用它的具体实现
public Coffee(CoffeeAdditives coffeeAdditives) {
this.coffeeAdditives = coffeeAdditives;
}
//具体的咖啡由子类去具体实现,这里就定义一个抽象方法
public abstract void makeCoffee();
}
//大杯咖啡
public class LargeCoffee extends Coffee{
public LargeCoffee(CoffeeAdditives coffeeAdditives) {
super(coffeeAdditives);
}
@Override
public void makeCoffee() {
System.out.println(getClass().getSimpleName()+":大杯的"+coffeeAdditives.addSomething()+"咖啡");
}
}
//小杯咖啡
public class SmallCoffee extends Coffee{
public SmallCoffee(CoffeeAdditives coffeeAdditives) {
super(coffeeAdditives);
}
@Override
public void makeCoffee() {
System.out.println(getClass().getSimpleName()+":小杯的"+coffeeAdditives.addSomething()+"咖啡");
}
}
实现部分,加糖不加糖的抽象
public abstract class CoffeeAdditives {
//加入咖啡的具体作料由子类来指定
public abstract String addSomething();
}
//加糖
public class Sugar extends CoffeeAdditives {
@Override
public String addSomething() {
return "加糖的";
}
}
//原味
public class Odinary extends CoffeeAdditives{
@Override
public String addSomething() {
return "原味的";
}
}
使用
public class Test {
public static void main(String[] args) {
//准备糖 和 原味的
Sugar sugar = new Sugar();
Odinary odinary = new Odinary();
//下面分别做四种咖啡:大杯原味 小杯原味 大杯加糖 小杯加糖
LargeCoffee largeCoffeeOdinary = new LargeCoffee(odinary);
largeCoffeeOdinary.makeCoffee();
SmallCoffee smallCoffeeOdinary = new SmallCoffee(odinary);
smallCoffeeOdinary.makeCoffee();
LargeCoffee largeCoffeeSugar = new LargeCoffee(sugar);
largeCoffeeSugar.makeCoffee();
SmallCoffee smallCoffeeSugar = new SmallCoffee(sugar);
smallCoffeeSugar.makeCoffee();
}
}
总结
桥接模式应用的不多,关键在于对抽象与实现的分离。优点是很好的,分析抽象与实现、灵活的扩展以及对客户来说透明的实现,但是不容易设计哦。
来源:CSDN
作者:萧寒-秦月
链接:https://blog.csdn.net/WWW_SYR/article/details/96509879