• 【结构型】桥接模式(Bridge)


    桥接模式(Bridge)

    将抽象部分与其实现部分分离,使它们都可以独立地变化。

    适用场景

    • 不希望在抽象和它的实现部分之间有一个固定的绑定关系。例如,这种情况可能是因为,在程序运行时刻实现部分应可以被选择或者切换。
    • 类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。这是Bridge模式使得开发者可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充。
    • 对一个抽象的实现部分的修改应对客户不产生影响,即客户代码不必重新编译。
    • (C++)想对客户完全隐藏抽象的实现部分。
    • 有许多类要生成的类层次结构。
    • 想在多个对象间共享实现(可能使用引用计数),但同时要求客户并不知道这一点。
      在这里插入图片描述
      ✦ Abstraction定义抽象类的接口,维护一个指向Implementor类型对象的指针。
      ✦ RefinedAbstraction扩充由Abstraction定义的接口。
      ✦ Implementor定义实现类的接口,该接口不一定要与Abstraction的接口完全一致;事实上这两个接口可以完全不同。一般来说,Implementor接口仅提供基本操作,而Abstraction定义了基于这些基本操作的较高层次的操作。
      ✦ ConcreteImplementor实现Implementor接口并定义它的具体实现。

    桥接模式实例代码(Java)

    //抽象产品,Abstraction定义抽象类的接口,维护一个指向Implementor类型对象的指针。
    abstract class Product {
        private String name;
        //受保护的
        protected Color color;
    
        public void setName(String name) {
            this.name = name;
        }
        public String getName() {
            return name;
        }
        public void setColor(Color color) {
            this.color = color;
        }
        public abstract void Operation();
    }
    
    // Implementor定义实现类的接口
    interface Color {
        void OperationImp(String name);
    }
    
    //ConcreteImplementor实现Implementor接口并定义它的具体实现。
    class Red implements Color {
        @Override
        public void OperationImp(String name) {
            System.out.println(name + ":红色");
        }
    }
    class Blue implements Color {
        @Override
        public void OperationImp(String name) {
            System.out.println(name + ":蓝色");
        }
    }
    
    //具体产品
    class ProductA extends Product {
        @Override
        public void Operation() {
            color.OperationImp(this.getName());
        }
    }
    
    public class BridgeMain {
        public static void main(String[] args) {
            Product productA1 = new ProductA();
            Color red = new Red();
            Blue blue = new Blue();
    
            productA1.setName("产品A1");
            productA1.setColor(red);
            productA1.Operation();
    
            Product productA2 = new ProductA();
            productA2.setName("产品A2");
            productA2.setColor(blue);
            productA2.Operation();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61

    其他设计模式详见本专栏其他博文~
    特别感谢zst_2001在备考软考期间提供的帮助,贴上博主B站
    zst_2001的个人空间

  • 相关阅读:
    QT常用的控件总结
    算法练习-LeetCode Hot 100 20. 有效的括号
    华厦眼科在创业板上市:市值达390亿元,前三季度收入约为25亿元
    【Git】常用命令大全
    算法刷题 week2
    2022.8.9考试游记总结
    基于SpringBoot的CSGO赛事管理系统
    phpcms v9对联广告关闭左侧广告
    UVA-1374 旋转游戏 题解答案代码 算法竞赛入门经典第二版
    dd命令测试硬盘IO
  • 原文地址:https://blog.csdn.net/qq_44033208/article/details/127739292