当前位置: 首页 > article >正文

23种设计模式之桥接设计模式

目录

  • 1. 简介
  • 2. 代码
    • 2.1 Shape (抽象化角色)
    • 2.2 Circle (扩展抽象化角色)
    • 2.3 Square (扩展抽象化角色)
    • 2.4 Tools (实现化角色)
    • 2.5 Pencil (具体实现化角色)
    • 2.6 Pen (具体实现化角色)
    • 2.7 Test (测试类)
  • 3. 使用场景
  • 4. 优缺点
  • 5. 总结

1. 简介

桥接模式是一种结构型设计模式。它将抽象部分与它的实现部分分离,使它们都可以独立地变化。这种模式通过使用组合 / 聚合关系而不是继承关系来实现抽象和实现部分的解耦。
例如,假设我们有一个图形绘制系统,它可以绘制不同颜色和不同形状的图形。如果使用继承,对于每种颜色和形状的组合都需要创建一个新的子类(如红色圆形类、蓝色方形类等),这样会导致类的数量急剧膨胀。而桥接模式可以把形状和颜色这两个维度分开处理,形状是抽象部分,颜色是实现部分,它们通过桥接的方式组合在一起,从而减少了类的数量并增加了灵活性。

  • 结构组成
    • 抽象化(Abstraction)角色
      它定义了抽象类的接口,通常包含一个对实现化对象的引用。它可以是抽象类也可以是接口。
      以图形绘制为例,抽象图形类(如Shape)就是抽象化角色,它有一个方法(如draw())用于绘制图形,并且包含一个对颜色对象的引用。
    • 扩展抽象化(Refined Abstraction)角色
      它是抽象化角色的子类,实现了在抽象化中定义的接口。
      比如Circle(圆形)、Square(方形)等具体图形类就是扩展抽象化角色。它们继承自Shape类,重写draw()方法,在其中结合自身形状特点和颜色来进行图形绘制。
    • 实现化(Implementor)角色
      它定义了实现化角色的接口,这个接口不一定要与抽象化角色的接口完全一致。
      在图形例子中,颜色接口(如Color)就是实现化角色,它有一个方法(如applyColor())用于应用颜色。
    • 具体实现化(Concrete Implementor)角色
      它是实现化角色的具体实现类。
      例如RedColor(红色)、BlueColor(蓝色)等具体颜色类就是具体实现化角色,它们实现了Color接口的applyColor()方法,用于确定如何将特定颜色应用到图形上。

2. 代码

2.1 Shape (抽象化角色)

public interface Shape {

    public void draw(String tools);
}

2.2 Circle (扩展抽象化角色)

public class Circle implements Shape{

    @Override
    public void draw(String tools) {
        System.out.println("使用工具:"+ tools +"--Drawing circle");
    }
}

2.3 Square (扩展抽象化角色)

public class Square implements Shape{
    @Override
    public void draw(String tools) {
        System.out.println("使用工具:"+ tools +"--Drawing square");
    }
}

2.4 Tools (实现化角色)

public abstract class Tools {
    public Tools(Shape shape){

    }
    public abstract void use();
}

2.5 Pencil (具体实现化角色)

public class Pencil extends Tools{

    private Shape shape;
    public Pencil(Shape shape) {
        super(shape);
        this.shape = shape;
    }
    @Override
    public void use() {
        shape.draw("Pencil");
    }
}

2.6 Pen (具体实现化角色)

public class Pen extends Tools{

    private Shape shape;
    public Pen(Shape shape) {
        super(shape);
        this.shape = shape;
    }

    @Override
    public void use() {
        shape.draw("pen");
    }
}

2.7 Test (测试类)

public class Test {
    public static void main(String[] args) {
        Tools pen = new Pen(new Circle());
        pen.use();

        Shape square = new Square();
        Tools pencil = new Pencil(square);
        pencil.use();
    }
}

运行结果:

使用工具:penDrawing circle
使用工具:PencilDrawing square

3. 使用场景

  • 当一个类存在两个独立变化的维度时
    例如汽车品牌和汽车的能源类型(汽油、电动等)。品牌是一个维度,能源类型是另一个维度。使用桥接模式可以避免为每个品牌 - 能源类型组合创建一个单独的类。
  • 需要在抽象化和实现化之间增加更多灵活性的时候
    比如在图形用户界面(GUI)库中,窗口的抽象概念和窗口的具体实现(不同操作系统下的窗口实现)可以使用桥接模式。这样可以方便地在不同操作系统(如 Windows、Linux 等)上实现相同的窗口抽象功能,并且可以独立地对窗口抽象和操作系统相关的实现进行修改。

4. 优缺点

  • 优点
    • 分离抽象和实现:使得抽象部分和实现部分可以独立地扩展和修改,提高了系统的可维护性和可扩展性。
    • 提高可组合性:可以方便地组合不同的抽象和实现,产生多种变化。
    • 符合开闭原则:在增加新的抽象或者实现时,不需要修改原有的代码,只需要实现新的类。
  • 缺点
    • 增加了系统的复杂度:因为引入了更多的类和对象间的关联关系,对于初学者来说可能比较难理解和设计。
    • 需要正确地识别抽象和实现部分:如果划分不当,可能无法充分发挥桥接模式的优势,甚至会使代码变得更加混乱。

5. 总结

使用一个抽象类来当接口,再来几个实现类。


http://www.kler.cn/a/418613.html

相关文章:

  • 【力扣】541.反转字符串2
  • MySQL 核心基础 | Pandaer杂货铺
  • Python小白语法基础18(文件操作)
  • 把当下的快乐和长远的目标连接在一起。
  • ECharts柱状图-交错正负轴标签,附视频讲解与代码下载
  • 斐波那契数
  • Hadoop生态圈框架部署(九)- Hive部署
  • 游戏启动时“msvcr120.dll文件丢失”是什么原因以及解决方案。四种解决办法轻松搞定“msvcr120.dll文件丢失”问题
  • hadoop集群搭建
  • 如何使用Spring Boot进行Web开发?
  • mysql系列2—InnoDB数据存储方式
  • Android内容提供者
  • SARIMA 模型Matlab代码
  • 制造入门知识-下篇
  • Qt中模拟鼠标消息并与系统鼠标消息进行区分
  • 信息收集-谷歌语法使用大全
  • 随时掌控健康,时刻监测血压,dido医疗级气泵血压手表评测
  • 单片机-- 复位的方式
  • stm32里一个定时器可以提供多路信号吗?
  • 简单web项目自定义部署Dockerfile
  • 数据分析学习
  • MLinear论文解析
  • 前端入门指南:前端模块有哪些格式?分别什么情况使用
  • linux 中后端jar包启动不起来怎么回事 -bash: java: 未找到命令
  • mysql的操作命令收集
  • Ubuntu20.04下安装Matlab2018