Java设计模式 —— 桥接模式(Bridge)

Java设计模式 —— 桥接模式(Bridge)

定义

桥接模式:将抽象部分与它的实现部分相分离,使他们能够独立的变化。html

特征:java

  1. 三个关键词,也就是抽象化、实现化和脱耦
  2. 桥接模式将抽象部分和实现部分分离,解耦
  3. 两个维度,独立变化,灵活的扩展

代码实现

简书:Android 设计模式之桥接模式web

  • 这里咱们经过泡咖啡的例子来简单看看桥接模式的实现和应用
public abstract class Coffee {
    protected CoffeeAdditives impl;

    public Coffee (CoffeeAdditives impl) {
        this.impl = impl;
    }

    /** * 咖啡具体是什么样的由子类决定 */
    public abstract void makeCoffee();
}
  • 咖啡的子类,大杯和小杯,加不加糖的操做经过impl添加进来
//大杯咖啡
public class LargeCoffee extends Coffee {

    public LargeCoffee(CoffeeAdditives coffeeAdditives) {
        super(coffeeAdditives);
    }

    @Override
    public void makeCoffee() {
        System.out.println("大杯的" + impl.addSomething() + "咖啡");
    }
}
//小杯咖啡
public class SmallCoffee extends Coffee {

    public SmallCoffee(CoffeeAdditives coffeeAdditives) {
        super(coffeeAdditives);
    }

    @Override
    public void makeCoffee() {
        System.out.println("小杯的" + impl.addSomething() + "咖啡");
    }
}
  • 下面咱们看看实现部分,也就是加不加糖
public abstract class CoffeeAdditives {

    /** * 具体添加什么东西由子类决定 * * @return 添加的东西,好比加糖 */
    public abstract String addSomething();
}
  • 加糖和不加糖的子类
//加糖
public class Sugar extends CoffeeAdditives {

    @Override
    public String addSomething() {
        return "加糖";
    }
}
//不加糖,这里就是原味了
public class Ordinary extends CoffeeAdditives {

    @Override
    public String addSomething() {
        return "原味";
    }
}
  • 以上抽象部分和实现部分都完成了,如今咱们来看看怎么“泡咖啡”
//原味
Ordinary ordinary = new Ordinary();

//加糖
Sugar sugar = new Sugar();

//大杯咖啡,原味
LargeCoffee largeCoffee = new LargeCoffee(ordinary);
largeCoffee.makeCoffee();

//小杯咖啡,原味
SmallCoffee smallCoffee = new SmallCoffee(ordinary);
smallCoffee.makeCoffee();

//大杯咖啡,加糖
LargeCoffee largeCoffeeSugar = new LargeCoffee(sugar);
largeCoffeeSugar.makeCoffee();

//小杯咖啡,加糖
SmallCoffee smallCoffeeSugar = new SmallCoffee(sugar);
smallCoffeeSugar.makeCoffee();
  • 输出日志

大杯的原味咖啡
小杯的原味咖啡
大杯的加糖咖啡
小杯的加糖咖啡编程

经过以上的例子咱们能够看出桥接模式可以分离抽象与实现,并且扩展也很灵活。好比咱们须要添加个中杯的咖啡,只须要在抽象部分,也就是写个Coffee的子类MiddleCoffee就好了,而实现部分,CoffeeAdditives则不受影响。若是咖啡须要加盐或是其余什么的一样也很简单。segmentfault

外观模式使用问题

优势:
一、抽象和实现的分离。
二、优秀的扩展能力。
三、实现细节对客户透明。设计模式

缺点:桥接模式的引入会增长系统的理解与设计难度,因为聚合关联关系创建在抽象层,要求开发者针对抽象进行设计与编程。ide

Android中外观模式

AbsListView跟ListAdapter之间就是一个桥接模式。
在这里插入图片描述
另外,Window 与 WindowManager 之间也是桥接模式。svg

感谢

segmentfault: 桥接模式
菜鸟教程:桥接模式
百度百科:桥接模式
博客园:《JAVA与模式》之桥梁模式
简书:Android 设计模式之桥接模式this