【写在模式之前的一些话】
对象的继承关系是在编译时就定义好了,所以无法在运行时改变从父类继承的实现。
1.前言
桥接模式是结构型设计模式,桥接模式就如其名字一样起着现实中“桥”的作用——连接两边。
2.定义
桥接模式:将抽象部分与实现部分分离,使它们都可以独立地进行变化。
3.UML图
Abstraction:抽象部分。保持一个对实现部分对象的引用,抽象部分中的方法需要调用实现部分的对象来实现,该类一般为抽象类。
Implementor:实现部分。接口或抽象形式。提供基本的操作。
RefinedAbstraction:优化的抽象部分。抽象部分的具体实现,对抽象部分方法进行扩展和完善。
ConcreteImplementorA/ConcreteImplementorB:实现部分的具体实现。完善实现部分中方法定义的具体逻辑。
Client:客户端
4.简单示例代码
//对应UML图中的抽象部分
public abstract class Coffee {
protected CoffeeAdditives impl;
//保持对CoffeeAdditives的引用,便于调用具体的实现
public Coffee(CoffeeAdditives impl){
this.impl = impl;
}
//咖啡具体什么样子由子类来决定
public abstract void makeCoffee();
}
//对应UML图中的Implementor实现部分
public abstract class CoffeeAdditives {
public abstract String addSomething();
}
public class LargeCoffee extends Coffee {
public LargeCoffee(CoffeeAdditives impl) {
super(impl);
}
@Override
public void makeCoffee() {
Log.d("zsf","大杯的" + impl.addSomething() + "咖啡");
}
}
public class SmallCoffee extends Coffee {
public SmallCoffee(CoffeeAdditives impl) {
super(impl);
}
@Override
public void makeCoffee() {
Log.d("zsf","小杯的" + impl.addSomething() + "咖啡");
}
}
public class Original extends CoffeeAdditives {
@Override
public String addSomething() {
return "原味";
}
}
public class Sugar extends CoffeeAdditives {
@Override
public String addSomething() {
return "加糖";
}
}
//原味咖啡
Original original = new Original();
//糖
Sugar sugar = new Sugar();
//大杯咖啡不加糖
LargeCoffee largeCoffee = new LargeCoffee(original);
largeCoffee.makeCoffee();
//大杯咖啡加糖
LargeCoffee largeCoffee1 = new LargeCoffee(sugar);
largeCoffee1.makeCoffee();
//小杯咖啡不加糖
SmallCoffee smallCoffee = new SmallCoffee(original);
smallCoffee.makeCoffee();
//
SmallCoffee smallCoffee1 = new SmallCoffee(sugar);
smallCoffee1.makeCoffee();
输出: