zoukankan      html  css  js  c++  java
  • 设计模式-桥接模式

    桥接模式

    定义:在软件系统中,某些类型由于自身的逻辑,它具有两个纬度的变化,那么如何应对这种多维度的变化呢?就是使他的抽象部分和实现部分分离开,使他们可以独立变化。

    使用场景:需要按两个维度区分的情况。比如奶茶,按杯型分为大中小,按温度分为常温、加冰。那么如果按照普通接口实现要定义3*2=6个类才能处理。

    桥接模式包含了以下角色:

    • 抽象化(Abstraction)角色:定义抽象类,并包含对实现化对象的引用
    • 扩展抽象化(Refined Abstraction)角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
    • 实现化角色(Implementor):定义实现化角色的接口,供扩展抽象化角色调用。
    • 具体实现化角色(Concrete Implementor):给出实现化角色接口的具体实现

    例子:我们去咖啡馆喝咖啡,一般有4种选择:大杯加糖,大杯不加糖,小杯加糖,小杯不加糖。按 桥接模式 来说,应该有两个实现:大小杯,有无糖(味道)。但是两个 实现 有点冗余,完全可以把 “大小杯” 这个维度归并到咖啡本身属性中,从而这个例子的维度变成:咖啡大小杯,有无糖(味道)。

    /**
     * @description:桥接模式
     * @author: mmc
     * @create: 2019-09-04 21:56
     **/
    
    public class Client {
    
        interface ICoffeeFlavor {
            String addWhat();
        }
    
    
        // ConcreteImplementor:原味
        static class PlainFlavor implements ICoffeeFlavor {
            @Override
            public String addWhat() {
                return "原味";
            }
        }
    
        // ConcreteImplementor:加糖
        static class SugarFlavor implements ICoffeeFlavor {
            @Override
            public String addWhat() {
                return "加糖";
            }
        }
    
        // Abstraction:咖啡
        static abstract class Coffee {
            protected ICoffeeFlavor mFlavor;
    
            public Coffee(ICoffeeFlavor flavor) {
                this.mFlavor = flavor;
            }
    
            public abstract void makeCoffee();
        }
    
        // RefinedAbstraction:大杯咖啡
        static class LargeCoffee extends Coffee {
            public LargeCoffee(ICoffeeFlavor flavor) {
                super(flavor);
            }
    
            @Override
            public void makeCoffee() {
                System.out.println("大杯咖啡: " + this.mFlavor.addWhat());
            }
        }
    
        // RefinedAbstraction:小杯咖啡
        static class SmallCoffee extends Coffee {
            public SmallCoffee(ICoffeeFlavor flavor) {
                super(flavor);
            }
    
            @Override
            public void makeCoffee() {
                System.out.println("小杯咖啡:" + this.mFlavor.addWhat());
            }
        }
    
        public static void main(String[] args) {
            Coffee coffee=new SmallCoffee(new SugarFlavor());
            coffee.makeCoffee();
            Coffee coffee2=new SmallCoffee(new PlainFlavor());
            coffee2.makeCoffee();
        }
    }
    

    返回目录

    书山有路勤为径,学海无涯苦作舟
  • 相关阅读:
    A1052. Linked List Sorting (25)
    A1032. Sharing (25)
    A1022. Digital Library (30)
    A1071. Speech Patterns (25)
    A1054. The Dominant Color (20)
    A1060. Are They Equal (25)
    A1063. Set Similarity (25)
    电子码表
    矩阵键盘
    对象追踪、临时对象追踪、绝对坐标与相对坐标
  • 原文地址:https://www.cnblogs.com/javammc/p/14940576.html
Copyright © 2011-2022 走看看