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

【设计模式-3.6】结构型——桥接模式

说明:本文介绍结构型设计模式之一的桥接模式

定义

桥接模式(Bridge Pattern)又叫作桥梁模式、接口(Interface)模式或柄体(Handle and Body)模式,指将抽象部分与具体实现部分分离,使它们都可以独立地变化,属于结构型设计模式。(引自《设计模式就该这样学》P263)

画笔

以画笔画画为例,如下,,是一个画笔抽象类

(抽象画笔类,Pen)

/*** 抽象画笔*/
public abstract class Pen {/*** 获取颜色*/public abstract void getColor();/*** 绘制图形*/public void draw() {getColor();System.out.print("▲");}
}

(黑色画笔,BlackPen,使用继承实现方法)

/*** 黑色画笔*/
public class BlackPen extends Pen {@Overridepublic void getColor() {System.out.print("黑色");}
}

绘制

public class Client {public static void main(String[] args) {new BlackPen().draw();}
}

如下:

在这里插入图片描述

画笔与尺子

上面的例子,针对绘制只有单个维度(颜色)的改变,是用继承(extends)实现其抽象方法的,如果是多维度的,例如加上尺子,绘制图案需要使用尺子和颜色。

如下,

(尺子接口,Ruler)

/*** 尺子接口*/
public interface Ruler {/*** 使用尺子规范绘制*/void regularize();
}

(正方形尺子,SquareRuler)

/*** 正方形*/
public class SquareRuler implements Ruler {@Overridepublic void regularize() {System.out.println("□");}
}

(三角形尺子,TriangleRuler)

/*** 三角形*/
public class TriangleRuler implements Ruler {@Overridepublic void regularize() {System.out.println("▲");}
}

(圆形尺子,CircleRuler)

/*** 圆形*/
public class CircleRuler implements Ruler {@Overridepublic void regularize() {System.out.println("◯");}
}

(抽象画笔,Pen,实例化一个尺子对象)

/*** 抽象画笔*/
public abstract class Pen {protected Ruler ruler;/*** 构造器注入*/public Pen(Ruler ruler) {this.ruler = ruler;}/*** 绘制图形*/public abstract void draw();
}

(黑色画笔,BlackPen)

/*** 黑色画笔*/
public class BlackPen extends Pen {/*** 构造器注入*/public BlackPen(Ruler ruler) {super(ruler);}@Overridepublic void draw() {System.out.print("黑");ruler.regularize();}
}

(白色画笔,WhitePen)

/*** 白色画笔*/
public class WhitePen extends Pen {/*** 构造器注入*/public WhitePen(Ruler ruler) {super(ruler);}@Overridepublic void draw() {System.out.print("白");ruler.regularize();}
}

绘制白色正方形,黑色圆形

public class Client {public static void main(String[] args) {new WhitePen(new SquareRuler()).draw();new BlackPen(new CircleRuler()).draw();}
}

在这里插入图片描述

可见使用桥接模式,可以连接两个维度的对象,避免了多维度对象之间的继承。

想想看,如果不使用以上设计,去掉画笔抽象类(Pen),而直接用黑色画笔、白色画笔去继承正方形尺子、三角形尺子、圆形尺子完成绘制也是可以的。如果这样,三个尺子,两种颜色画笔,会有六个类,如果是七个尺子,十种颜色的画笔,就会有7 × 10,70个类,类会非常多,不利于管理,这是一个问题。另外,使用继承违反了设计模式的合成复用原则(Composite Reuse Principle,CRP,尽量使用对象组合,而不是继承来达到复用的目的)。

关于设计模式的原则,参考下面这篇文章:

  • 【设计模式-1】UML和设计原则

使用场景

在《设计模式就该这样学》(P264)这本书中,提到状态模式适用于以下场景:

(1)在抽象和具体实现之间需要增加更多灵活性的场景。

(2)一个类存在两个(或多个)独立变化的维度,而这两个(或多个)维度都需要独立进行扩展。

如上述画笔颜色和尺子,需要独立扩展,如果用继承把画笔和尺子绑定死,还怎么独立扩展?

(3)不希望使用继承,或因为多层继承导致系统类的个数剧增。

总结

本文介绍了结构型设计模式中的桥接模式,参考《设计模式就该这样学》、《秒懂设计模式》两本书,其中的例子来自《秒懂设计模式》。

http://www.xdnf.cn/news/764497.html

相关文章:

  • 设计模式——访问者设计模式(行为型)
  • 使用 OpenCV (C/C++) 通过二值化增强车牌识别
  • 【机器学习基础】机器学习入门核心:数学基础与Python科学计算库
  • nssctf第一题[SWPUCTF 2021 新生赛]re1
  • 每日算法刷题计划Day20 6.2:leetcode二分答案3道题,用时1h20min
  • 深度学习|pytorch基本运算-hadamard积、点积和矩阵乘法
  • 如何学习才能更好地理解人工智能工程技术专业和其他信息技术专业的关联性?
  • Python-matplotlib库画不规则图
  • 机器视觉图像处理之图像滤波
  • LeetCode 高频 SQL 50 题(基础版) 之 【高级查询和连接】· 上
  • 深度学习与神经网络 前馈神经网络
  • 【LeetCode】数组刷题汇总记录
  • 二、Kubernetes 环境搭建
  • vue中父子参数传递双向的方式不同
  • Git GitHub Gitee
  • Windows环境下Scoop包管理工具的全面指南
  • [yolov11改进系列]基于yolov11引入特征融合注意网络FFA-Net的python源码+训练源码
  • 自定义序列生成器之单体架构实现
  • I2C Host Adapter (1)
  • 移除3D对象的某些部分点云
  • 使用TDEngine REST API + Python来计算电力指标的ETL真实案例
  • 前端框架Vue
  • CTF:网络安全的实战演练场
  • 系统级 EOS 测试方法 - System Level EOS Testing Method
  • Ⅱ.计算机二级选择题(运算符与表达式)
  • C++之动态数组vector
  • 【软件测试】测试框架(unittest/pytest)
  • 【Elasticsearch】ILM(Index Lifecycle Management)策略详解
  • 【Java Web】速通Tomcat
  • Origin将杂乱的分组散点图升级为美观的带颜色映射的气泡图