设计模式

桥接模式(Bridge)

2020-07-20  本文已影响0人  秀儿2020

定义

将抽象部分和实现部分相分离,使得他们都可以独立的变化。

一个类存在两个独立变化的维度,并且这两个维度都需要进行扩展。

本质

分离抽象和实现

登场角色

代码示例

/**
 * 抽象部分
 * 需要保持一个对实现部分对象的引用,一边调用具体的实现
 */
public abstract class Coffee {
    protected CoffeeAdditives coffeeAdditives;
    public Coffee(CoffeeAdditives coffeeAdditives) {
        this.coffeeAdditives = coffeeAdditives;
    }
    /**
     * 由子类决定咖啡具体是什么样子
     */
    public abstract void makeCoffee();
}



/**
 * 抽象部分的实现1
 */
public class LargeCoffee extends Coffee{
    public LargeCoffee(CoffeeAdditives coffeeAdditives) {
        super(coffeeAdditives);
    }

    @Override
    public void makeCoffee() {
        System.out.println("大杯的" + coffeeAdditives + "咖啡");
    }
}


/**
 * 抽象部分的实现2
 */
public class SmallCoffee extends Coffee{
    public SmallCoffee(CoffeeAdditives coffeeAdditives) {
        super(coffeeAdditives);
    }

    @Override
    public void makeCoffee() {
        System.out.println("小杯的" + coffeeAdditives + "咖啡");
    }
}


/**
 * 实现部分
 */
public abstract class CoffeeAdditives {
    /**
     * 具体要往咖啡里加什么要由子类决定
     */
    public abstract String addSomething();
}


/**
 * 实现部分的具体实现2
 */
public class OrdinaryCoffee extends CoffeeAdditives{
    @Override
    public String addSomething() {
        return "原味";
    }
}

/**
 * 实现部分的具体实现1
 */
public class SugerCoffee extends CoffeeAdditives{
    @Override
    public String addSomething() {
        return "加糖";
    }
}

/**
 * 测试
 */
public class Main {
    public static void main(String[] args){
        //原汁原味
        OrdinaryCoffee ordinaryCoffee = new OrdinaryCoffee();
        //加糖
        SugerCoffee sugerCoffee = new SugerCoffee();
        //大杯咖啡 原味
        LargeCoffee largeCoffeeOrdinary = new LargeCoffee(ordinaryCoffee);
        largeCoffeeOrdinary.makeCoffee();
        ///小杯咖啡 原味
        SmallCoffee smallCoffeeOrdinary = new SmallCoffee(ordinaryCoffee);
        smallCoffeeOrdinary.makeCoffee();

        //大杯咖啡 加糖
        LargeCoffee largeCoffeeSuger = new LargeCoffee(sugerCoffee);
        largeCoffeeSuger.makeCoffee();
        //小杯咖啡 加糖
        SmallCoffee smallCoffeeSuger = new SmallCoffee(sugerCoffee);
        smallCoffeeSuger.makeCoffee();
    }
}

运行结果

大杯的bridge1.OrdinaryCoffee@6ce253f1咖啡
小杯的bridge1.OrdinaryCoffee@6ce253f1咖啡
大杯的bridge1.SugerCoffee@e9e54c2咖啡
小杯的bridge1.SugerCoffee@e9e54c2咖啡

优点

缺点

何时使用

桥接模式也称为桥梁模式,这里桥梁的作用其实就是连接抽象部分与实现部分,但是事实上,任何多维度变化类或者说多个树状类之间的耦合都可以使用桥接模式来实现解耦。

如果一个系统需要在构建的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,可以使用桥接模式使他们在抽象层建立一个关联关系。

对于那些被不喜欢使用继承或者因为多层次继承导致类的个数急剧增加的系统,也可以考虑使用桥接模式。

上一篇 下一篇

猜你喜欢

热点阅读