桥接模式
一、简介
桥接模式承担着连接“两边”的作用,此处的两边指的是抽象部分和实现部分。
定义:将抽象部分与实现部分分离是的它们都能独立的进行变化。
二、使用场景
- 任何多维度变化类或者多个梳妆类之间的耦合都可以使用桥接模式来实现解耦
- 如果一个系统需要在构建的抽象化角色和具体角色之间增加更多的灵活性避免在两个层次之间建立静态的继承关系,可以通过桥接模式使他们在抽象层建立一个关联关系
- 对于不希望使用继承关系或因为多层次继承关系导致系统类的个数急剧增加的系统可以使用桥接模式
- 一个类需要两个独立变化的维度且这两个维度都需要进行扩展
三、简单实现
这里以喝咖啡为例简单实现桥接模式,当我们下单咖啡时会选择大杯还是小杯、加糖还是不加糖等所以对一杯咖啡来说有两种变化一是大杯小杯 二是加糖还是不加糖。
//抽象咖啡类
public abstract class Coffee{
protected 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() {
Log.i(TAG, "makeCoffee: large "+coffeeAdditives.addSomething()+" coffee");
}
}
public class SmallCoffee extends Coffee{
public SmallCoffee(CoffeeAdditives coffeeAdditives) {
super(coffeeAdditives);
}
@Override
public void makeCoffee() {
Log.i(TAG, "makeCoffee: small "+coffeeAdditives.addSomething()+" coffee");
}
}
public abstract class CoffeeAdditives {
public abstract String addSomething();
}
public class Suger extends CoffeeAdditives{
@Override
public String addSomething() {
return "sugre";
}
}
public class Ordinary extends CoffeeAdditives{
@Override
public String addSomething() {
return "";
}
}
public void Test(){
Ordinary ordinary=new Ordinary();
Suger suger=new Suger();
LargeCoffee largeCoffee=new LargeCoffee(ordinary);
LargeCoffee largeCoffee1=new LargeCoffee(suger);
SmallCoffee smallCoffee=new SmallCoffee(ordinary);
SmallCoffee smallCoffee1=new SmallCoffee(suger);
}
可以看到我们对咖啡变化的两个维度定义了两个对应的抽象类,然后跟据情况分别实现了这两个抽象类的实现类,这样这两个维度就可以自由独立变化两者之间的唯一联系就是Coffee中保持对CoffeeAdditives的引用。当我们增加中杯咖啡时就非常的方便只需实现中杯咖啡类即可
public class MiddleCoffee extends Coffee{
public MiddleCoffee(CoffeeAdditives coffeeAdditives) {
super(coffeeAdditives);
}
@Override
public void makeCoffee() {
Log.i(TAG, "makeCoffee: middle "+coffeeAdditives.addSomething()+" coffee");
}
}
//创建不同的MiddleCoffee
MiddleCoffee middleCoffee=new MiddleCoffee(ordinary);
MiddleCoffee middleCoffee1=new MiddleCoffee(suger);
四、小结
在Android中桥接模式使用的非常广泛,比如Adapter和AdapterView以及Window和WindowManager。桥接模式对于抽象与实现的分离的把握是不容易控制的,这对开发者来说需要一定的经验要求。但是桥接模式具有分离抽象与实现、灵活的扩展以及对客户来说透明的实现等优点。