桥接模式

喜欢上一个不喜欢你的人,那种可望不可及,放弃又不甘心的感觉,怎一个愁字了得。

桥接模式

定义:用于把抽象化和实现化解耦,使得二者可以独立变化。
我承认我不知道这个定义是啥意思,等以后有了更深的理解,再来补充。
举例说明 画图形
我们可以定义一个抽象类Shape,然后派生出长方形,三角形,圆形等等


Class Diagram.png

现在如果我们要画出不同颜色的各种形状,该怎么办呢?

  1. 第一种方式,就是直接从Shape派生各种颜色的形状。比如我们现在有红绿蓝三种颜色,那么类图会是这样的。


    Class Diagram (1).png

    如果现在有四个形状,四种颜色,那么,生成的子类数量就比较客观了。

  2. 第二种方式,根据实际需要对颜色和形状进行组合。提供两个父类一个是颜色、一个形状,颜色父类和形状父类两个类都包含了相应的子类,然后根据需要对颜色和形状进行组合。如下图所示。


    Class Diagram (2).png

Shape抽象类

package com.hm.pattern.bridge;

public abstract class Shape {

    Color color;

    public Shape(Color color) {
        this.color = color;
    }

    protected abstract void draw();
}

Rectangle

package com.hm.pattern.bridge;

public class Rectangle extends Shape {

    public Rectangle(Color color) {
        super(color);
    }

    @Override
    protected void draw() {
       color.drawColorShape("rectangle");
    }
}

Circle

package com.hm.pattern.bridge;

public class Circle extends Shape {

    public Circle(Color color) {
        super(color);
    }

    @Override
    protected void draw() {
        color.drawColorShape("circle");

    }
}

Triangle

package com.hm.pattern.bridge;

public class Triangle extends Shape {

    public Triangle(Color color) {
        super(color);
    }

    @Override
    protected void draw() {
        color.drawColorShape("triangle");
    }
}

Color抽象类

package com.hm.pattern.bridge;

public abstract class Color {

    abstract void drawColorShape(String shape);
}

Red

package com.hm.pattern.bridge;

public class Red extends Color {
    @Override
    void drawColorShape(String shape) {
        System.out.println("red:" + shape);
    }
}

Blue

package com.hm.pattern.bridge;

public class Blue extends Color {
    @Override
    void drawColorShape(String shape) {
        System.out.println("blue:" + shape);
    }
}

Green

package com.hm.pattern.bridge;

public class Green extends Color {
    @Override
    void drawColorShape(String shape) {
        System.out.println("green:" + shape);
    }
}

测试类

package com.hm.pattern.bridge;

public class BridgeTest {

    public static void main(String[] args) {

        Color red = new Red();
        Shape rectangle = new Rectangle(red);
        Shape circle = new Circle(red);

        Color blue = new Blue();

        Shape rectangleBlue = new Rectangle(blue);
        Shape circleBlue = new Circle(blue);

        rectangle.draw();
        circle.draw();

        rectangleBlue.draw();
        circleBlue.draw();
    }


}

输出

red:rectangle
red:circle
blue:rectangle
blue:circle

优点

  1. 分离抽象接口及其实现部分。提高了比继承更好的解决方案。
  2. 桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。
  3. 实现细节对客户透明,可以对用户隐藏实现细节。

缺点

  1. 桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
  2. 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性。

使用场景

  1. 如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。
  2. 对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。
  3. 一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。

先记录下来,在后续的学习研究中再不断补充。

参考链接

  1. 桥接模式
  2. 设计模式:桥接模式(Bridge)
  3. 设计模式读书笔记-----桥接模式
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 桥接模式 在开始学java的时候老师讲到继承的时候,总是喜欢用一个例子来讲解,那就是画图,这里有一个画笔,可以画正...
    han2019阅读 4,193评论 0 0
  • 1 场景问题# 1.1 发送提示消息## 考虑这样一个实际的业务功能:发送提示消息。基本上所有带业务流程处理的系统...
    七寸知架构阅读 10,540评论 5 63
  • 在正式介绍桥接模式之前,我先跟大家谈谈两种常见文具的区别,它们是毛笔和蜡笔。假如我们需要大中小3种型号的画笔,能够...
    justCode_阅读 5,764评论 0 7
  • 【学习难度:★★★☆☆,使用频率:★★★☆☆】直接出处:桥接模式梳理和学习:https://github.com/...
    BruceOuyang阅读 4,578评论 0 2
  • 目录 本文的结构如下: 引言 什么是桥接模式 模式的结构 典型代码 代码示例 优点和缺点 适用环境 模式应用 一、...
    w1992wishes阅读 5,754评论 0 6

友情链接更多精彩内容