• 设计模式篇---桥接模式


    概念

    桥接模式:将抽象部分与它的实现部分解耦,使得两者都能够独立变化。
    毛笔和蜡笔都属于画笔,假设需要有大、中、小三种型号的画笔,绘画出12种颜色,蜡笔需要3*12=36支,毛笔需要3支毛笔+12个颜色=15个对象。当扩展一种型号的画笔时,蜡笔再需要12支,毛笔只需要一支。毛笔的这种思想的本质就是桥接模式。
    颜色和型号是两个不同的变化维度,各自进行扩展理应该不影响另外一方,但蜡笔将颜色和型号糅合在了一起,这就产生了耦合,当一方发生扩展时势必要引起另一方的变动。

    结构

    桥接模式的结构图如下:
    在这里插入图片描述
    Abstraction(抽象类):用于定义抽象类的接口,其中定义了一个Implementor类型的对象。Abstraction中可以使用Implementor中的方法,通过关联的方式,而不是继承。该接口即可以包含抽象业务方法也可以包含具体业务方法;它可以理解为是毛笔。
    RefinedAbstraction(扩充抽象类):它是Abstraction的实现。
    Implementor(实现类接口):该接口提供一些基本的操作,并将这些基本的实现让子类来完成;它可以理解为是颜色。
    ConcreteImplementor(具体实现类):它具体实现了Implementor接口,在不同的ConcreteImplementor中有不同的实现操作。

    实例

    现在以毛笔为例,实现它的demo
    在这里插入图片描述
    毛笔的抽象类

    public abstract class Quill {
    
        protected Color color;
    
        protected Quill (Color color) {
            this.color = color;
        }
    
        public abstract void draw(Color color);
        
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    颜色的抽象类,与毛笔的抽象类是桥接关系。

    public abstract class Color {
    
        abstract void color();
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    大号毛笔

    public class BigQuill extends Quill {
        public BigQuill(Color color) {
            super(color);
        }
    
        @Override
        public void draw(Color color) {
            System.out.println("大号毛笔");
            color.color();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    中号毛笔

    public class MediumQuill extends Quill {
        public MediumQuill(Color color) {
            super(color);
        }
    
        @Override
        public void draw(Color color) {
            System.out.println("中号毛笔");
            color.color();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    小号毛笔

    public class SmallQuill extends Quill  {
        public SmallQuill(Color color) {
            super(color);
        }
    
        @Override
        public void draw(Color color) {
            System.out.println("小号毛笔");
            color.color();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    红色

    public class RedColor extends Color {
        @Override
        void color() {
            System.out.println("红色");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    绿色

    public class GreenColor extends Color{
        @Override
        void color() {
            System.out.println("绿色");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    黑色

    public class BlackColor extends Color{
        @Override
        void color() {
            System.out.println("黑色");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    客户端

    public class Client {
    
        public static void main(String[] args) {
            Color redColor = new RedColor();
            Quill bigQuill = new BigQuill(redColor);
            bigQuill.draw(redColor);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    总结

    在使用桥接模式时应该识别出一个类具有两个独立的变化维度,就比如毛笔本身具有一个维度,需要画出颜色就需要另外一个维度–颜色,颜色本身并不属于毛笔中的属性,它和毛笔本身是一个“设置”关系,所以它也可以作为一个抽象类,和毛笔进行桥接。
    桥接模式使用的场景:
    1、如果一个系统需要在抽象化和具体化之间增加更多的灵活性,可以考虑通过桥接模式使它们建立一个抽象的管理关系。
    2、抽象部分和被“设置”部分可以通过继承的方式独立扩展而不相互影响。
    3、一个类存在多个独立的变化维度,而这些维度需要独立的进行扩展。
    4、不希望因为使用继承或多重继承而导致类的个数急剧增加的系统。

  • 相关阅读:
    Stable Diffuse 之 本地环境部署/安装包下载搭建过程简单记录
    IP-Guard桌面申请管理说明步骤
    umich cv-5-1 神经网络训练1
    selenium安装和python中基本使用
    【leetcode】最长斐波那契数列
    一种新的在 fragment 中处理按键返回的方法
    [HDCTF 2023]YamiYami
    Item 39: Consider void futures for one-shot event communication.
    browserslist 选项的目的是什么?
    BATJ和字节跳动这些大厂的内部面试解析,面试重难点超出你的想象
  • 原文地址:https://blog.csdn.net/aaaPostcard/article/details/132525794