美文网首页
桥接模式(不只改变你的实现,也改变你的抽象)

桥接模式(不只改变你的实现,也改变你的抽象)

作者: 钉某人 | 来源:发表于2017-11-18 15:13 被阅读0次
    源码地址 https://github.com/DingMouRen/DesignPattern
    桥接模式.png
    • Abstraction定义抽象部分的接口,该类保持一个对实现部分对象的引用,抽象部分中的方法需要条用实现部分的对象来实现。
    • RefinedAbstraction扩充由Abstraction定义的接口,相当于优化
    • Implementor定义实现部分的接口,该接口不一定要与Abstraction的接口完全一致,事实上这两个接口可以完全不同。一般来说,Implementor接口仅提供基本操作,而Abstraction则定义基于这些基本操作的较高层次的操作。
    • ConcreteImplementorA、ComcreteImplementorB实现Implementor接口并定义它的具体实现。
    定义

    桥接模式将抽象部分与实现部分分离,使他们都可以独立的进行变化。

    使用场景
    举个栗子

    注意:这里的抽象部分和实现部分只是两个独立变化的维度,独立变化。

    我们平常喝咖啡的时候分别有大杯小杯的,还有加糖和不加糖的,这两种变化时独立变化的,互不影响。我们把大杯小杯作为抽象部分,加不加糖作为实现部分。

    //抽象部分
    public abstract class Coffee {
        protected CoffeeAdditives 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() {
            System.out.println(getClass().getSimpleName()+":大杯的"+coffeeAdditives.addSomething()+"咖啡");
        }
    }
    
    
    //实现部分,加糖不加糖的抽象
    public abstract class CoffeeAdditives {
        //加入咖啡的具体作料由子类来指定
        public abstract String addSomething();
    }
    //加糖
    public class Sugar extends CoffeeAdditives {
        @Override
        public String addSomething() {
            return "加糖的";
        }
    }
    
    
    使用
        public static void main(String[] args) {
            //准备糖 和 原味的
            Sugar sugar = new Sugar();
            Odinary odinary = new Odinary();
            //下面分别做四种咖啡:大杯原味 小杯原味  大杯加糖  小杯加糖
            LargeCoffee largeCoffeeOdinary = new LargeCoffee(odinary);
            largeCoffeeOdinary.makeCoffee();
    
            SmallCoffee smallCoffeeOdinary = new SmallCoffee(odinary);
            smallCoffeeOdinary.makeCoffee();
    
            LargeCoffee largeCoffeeSugar = new LargeCoffee(sugar);
            largeCoffeeSugar.makeCoffee();
    
            SmallCoffee smallCoffeeSugar = new SmallCoffee(sugar);
            smallCoffeeSugar.makeCoffee();
        }
    
    总结

    桥接模式应用的不多,关键在于对抽象与实现的分离。优点是很好的,分析抽象与实现、灵活的扩展以及对客户来说透明的实现,但是不容易设计哦。

    相关文章

      网友评论

          本文标题:桥接模式(不只改变你的实现,也改变你的抽象)

          本文链接:https://www.haomeiwen.com/subject/nqievxtx.html