桥接模式
定义:
将抽象部分和实现部分分离,使他们都可以独立的进行变化
使用场景
- 任何多维度变化类或者多个树状类之间的耦合都可以使用桥接模式来实现耦合。
- 如果一个系统需要在构建的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,可以通过桥接模式使它们在抽象层建立一个关联联系。
- 对于不希望使用继承或者因为多层次的继承导致系统类的个数急剧增加的系统,也可使用桥接模式
- 一个类存在两个独立变化的纬度,并且这两个纬度都需要进行扩展
桥接模式写法
UML图如下:
- Client 调用端:这是Bridge模式的调用者
- Abstraction:抽象部分,持有对实现部分对象的引用,抽象部分中的方法需要调用实现部分的对象来实现,一般为抽象类
- RefinedAbstraction:优化的抽象部分,抽象部分的具体实现,该类一般是对抽象部分的方法进行完善和扩展
- Implementor:实现部分(Abstraction接口定义了基于Implementor接口的更高层次的操作)
- ConcreteImplementor:实现部分的具体实现,完善实现部分中方法定义的具体逻辑
但是这里我们知道所谓的“抽象”和“实现”其本质是两个独立变化纬度,在我看来就是独立的变化的两部分,不用过于扣中概念
我们知道咖啡的分类可以从杯种和是否加糖来分类,这是两个不同的纬度或说这是两个独立变化的部分,我们以此为例
纬度一:杯种
public abstract class Coffee {
protected CoffeeAdd addImpl;
//持有另一维度的引用
public Coffee(CoffeeAdd addImpl) {
this.addImpl = addImpl;
}
//具体咖啡是什么样子的由子类实现
public abstract void makeCoffee();
}
//大杯
public class LargeCoff extends Coffee{
public LargeCoff(CoffeeAdd impl) {
super(impl);
}
@Override
public void makeCoffee() {
System.out.println("大杯的"+impl+"咖啡");
}
}
//小杯
public class SmallCoff extends Coffee{
public SmallCoff(CoffeeAdd impl) {
super(impl);
}
@Override
public void makeCoffee() {
System.out.println("小杯的"+impl+"咖啡");
}
}
纬度二:是否加糖
public abstract class CoffeeAdd {
public abstract String addSomething();
}
public class Sugar extends CoffeeAdd {
@Override
public String addSomething() {
return "加糖";
}
}
public class Ordinary extends CoffeeAdd {
@Override
public String addSomething() {
return "原味";
}
}
客户端调用
public class Client{
public static void main(String[] args) {
//原味
Ordinary implOrdinary = new Ordinary();
//准备糖类
Sugar implSugar = new Sugar();
//大杯咖啡 原味
LargeCoffee largeCoffee = new LargeCoffee(implOrdinary);
largeCoffee.makeCoffee();
//大杯咖啡 加糖
LargeCoffee largeCoffee = new LargeCoffee(implSugar);
largeCoffee.makeCoffee();
//小杯咖啡 原味
SmallCoffee smallCoffee = new SmallCoffee(implOrdinary);
smallCoffee.makeCoffee();
//小杯咖啡 加糖
SmallCoffee smallCoffee = new SmallCoffee(implSugar);
smallCoffee.makeCoffee();
}
}
此时当有中杯的咖啡时,只需要继承Coffee重新定义一个即可,同样在CoffeeAdd中可以添加多种变化,例如加奶、加蜂蜜等,由此可见无论是Coffee还是CoffeeAdd发生变化,相对于对方而言都是独立的,没有交集的,两者之间唯一的联系就是Coffee中保持对CoffeeAdd的引用,这是两者之间的纽带,这就是桥接模式的本意
桥接模式在Android中应用是比较广泛的,但是一般而言都是作用于大范围的,例如Window和WindowManager,此处不再细说
Android源码设计模式