Android设计模式-23-桥接模式
2018-06-21 本文已影响75人
今阳说
1. 定义
- 将抽象部分与实现部分解耦,使他们都可以独立的进行变化
- 又称桥梁模式,柄体模式
2. 使用场景:
任何多维度变化类或者多个树状类之间的耦合都可以使用桥接模式来实现解耦
- 需要在抽象化角色与具体化角色间增加更多灵活性,避免建立静态的继承联系
- 不希望使用继承或由于多层次继承导致系统类的个数急剧增加时
- 一个类存在两个独立变化的维度,且这两个维度都需要进行扩展
3. 优缺点
- 优点:
- 抽象和实现的分离
- 优秀的扩展能力
- 实现细节对客户透明
- 缺点:桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程
4. Android源码中的使用:
- CheckBox,Button,TextView,等View的绘制都是由与View相关的功能实现类DisplayList,HardwareLayer,Canvas负责
- Adapter和AdapterView(AbsListView的父类)
- Window和WindowManager
5. 实例演示
以咖啡大小杯和口味为例,不管是Coffee变化(大小杯),还是风味变化(CoffeeAdditives),其相对于对方而言都是独立的,两者唯一的联系就是Coffee中保持对coffeeAdditives的引用,为二者间的纽带,这就是桥接模式
- 创建一个咖啡调味剂的抽象类
public abstract class CoffeeAdditives {
public abstract String addSomething();
}
- 调味剂的实现类,如原味,奶香,焦糖等
public class Sugar extends CoffeeAdditives {
@Override
public String addSomething() {
return "焦糖";
}
}
public class Ordinary extends CoffeeAdditives {
@Override
public String addSomething() {
return "原味";
}
}
- 创建咖啡的抽象类
public abstract class Coffee {
protected CoffeeAdditives impl;
public Coffee(CoffeeAdditives impl) {
this.impl = impl;
}
public abstract void makeCoffee();
}
- 咖啡的实现类,大杯中杯小杯等
//大杯
public class LargeCoffee extends Coffee {
public LargeCoffee(CoffeeAdditives impl) {
super(impl);
}
@Override
public void makeCoffee() {
LjyLogUtil.i("大杯的" + impl.addSomething() + "咖啡");
}
}
//小杯
public class SmallCoffee extends Coffee {
public SmallCoffee(CoffeeAdditives impl) {
super(impl);
}
@Override
public void makeCoffee() {
LjyLogUtil.i("小杯的" + impl.addSomething() + "咖啡");
}
}
- 创建不同风味,不同大小的咖啡
private void methodBridgePattern() {
//原味调料
Ordinary ordinary = new Ordinary();
//焦糖调料
Sugar sugar = new Sugar();
//大杯原味
LargeCoffee largeCoffeeOrdinary = new LargeCoffee(ordinary);
largeCoffeeOrdinary.makeCoffee();
//大杯加糖
LargeCoffee largeCoffeeSugar = new LargeCoffee(sugar);
largeCoffeeSugar.makeCoffee();
//小杯原味
SmallCoffee smallCoffeeOrdinary = new SmallCoffee(ordinary);
smallCoffeeOrdinary.makeCoffee();
//小杯加糖
SmallCoffee smallCoffeeSugar = new SmallCoffee(sugar);
smallCoffeeSugar.makeCoffee();
}