3.4 桥接模式
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
9
桥接模式应用实例
• 考虑一个自动茶水销售机的实例,该机器销售的茶水在杯子的体积上分为中杯 和大杯,在茶叶品种上分为红茶和绿茶,这里要进行销售程序设计。为了简单 起见,假设程序的主要功能为根据茶杯的大小与茶的种类计算一杯茶的销售价 格。使用桥接模式进行设计。用户通过选择“Super Cup”或者”Medium Cup”,及“Red Tea”或“Green Tea”获得一杯茶的价格。
• 桥接模式是指将抽象部分与它的实现部分分离,使它们可以独立地变化。桥接 模式的设计类图如图3.43所示。
Abstraction abstraction; Implementor implementor; String imp = getImplementor(); if(imp.compareTo(A)==0) {implementor = new ConcreteImplementorA();} if(imp.compareTo(B)==0) {implementor = new ConcreteImplementorB();} abstraction = new RefinedAbstraction(implementor); abstraction.OperationImp();
GeoForm g; Measure m; String form = getGeoForm(); String measure = getMeasure(); if(form.compareTo(Cube)==0) {g = new Cube();} if(form.compareTo(EllipseCylinder)==0) {g = new EllipseCylinder();} if(measure.compareTo(MeterMeasure)==0) {m = new MeterMeasure(g);} if(measure.compareTo(FootMeasure)==0) {m = new FootMeasure(g);} float volume = m.findVolume();
由此看来,在所设计的程序中有几个维度时,将抽象部分与实现部分分离的 设计,可以使程序独立、互不影响地增加类,而不需要改变甚至不需要重新 编译已经存在的类。
7
桥接模式的概念和机制
• 桥接模式是指将抽象部分与它的实现部分分离,使它们可以独立地变化。桥接 模式的设计类图如图3.43所示。
8
桥接模式的概念和机制
13
关于桥接模式的讨论
• 关于椭圆,Java API 中的Ellipse2D 以及两个实现类Ellipse2D.double与 Ellipse2D.float都是以左上角坐标与长、宽声明一个椭圆。但是数学工作者习 惯于使用椭圆中心与长、短半轴声明一个椭圆。因此有必要定义一个新的椭圆 接口,带有两个不同的实现类EllipseByCorner与EllipseByCenter,并且希 望这两个椭圆类都有画椭圆的功能。但是画图是一项单独的功能,不适合放在 EllipseByCorner与EllipseByCenter中,因此,将画椭圆图的功能单独封装 在EllipseDrawer类的结构体中。设计类图如图3.47所示。
通过该设计,将椭圆的声明与具体的椭圆画法分开了。那么现在该设计是否 遵循桥接模式的设计?
14
本周课程作业
• 开发一个跨平台视频播放器,可以在不同操作系统平台(如Windows、Linux、 UNIX等)上播放多种格式的视频文件,如MPEG、RMVB、AVI、WMV等常见 视频格式。现使用桥接模式设计该播放器。
4
引言
• 现在考虑将整个类拆分成两个类的结构体进行重新设计,如图3.40所示。
5
引言
• 因为新的设计将抽象部分与实现部分分离开来,所以比较容易在茶的品种和茶 杯的体积方面增加新的类。例如,若增加一个类BlackTea,只需增加一个 Teakind的子类,如图3.41所示.
6
引言
• 如果又要增加一个新的销售小杯茶水的功能,则只需要增加一个TeaSize的子 类SmallCup类即可,如图3.42所示。
以上设计的缺点是具有重复性且缺乏可扩展性。
2
引言
• 按照茶杯的大小分类,可以设计出如图3.38所示的类的结构体。
3
引言
• 现在,如果需要添加一个新的茶叶品种,如BlackTea,则需要分别在MedTea 和SuperTea的子类位置添加BlackTea类,如图3.39所示
以上设计确实仍符合开闭原则,但是添加一个类需要同时在两个地方进行操 作,还是比较麻烦。
•
现欲实现一个图像浏览系统,要求该系统能够显示BMP、JPEG和GIF三种格式 的文件,并且能够在Windows和Linux两种操作系统上运行。系统首先将BMP、 JPEG和GIF三种格式的文件解析为像素矩阵,然后将像素矩阵显示在屏幕上。 系统必须具有较好的扩展性以支持新的文件格式和操作系统。为满足上述需求 并减少所需生成的子类数目,采用桥接设计模式,请画出类图。
15
11
桥接模式应用实例
• 在不同的度量下体积计算问题。假如要计算在米(Meter)与英尺(Foot)度 量下的空间几何体的体积问题,利用桥接模式进行设计。
12
ቤተ መጻሕፍቲ ባይዱ
桥接模式应用实例
• 在不同的度量下体积计算问题。假如要计算在米(Meter)与英尺(Foot)度 量下的空间几何体的体积问题,利用桥接模式进行设计。
10
桥接模式应用实例
• 假设程序的主要功能为根据茶杯的大小与茶的种类计算一杯茶的销售价格,使 用桥接模式进行设计。
String size = getTeaSize(); String kind = getTeaKind(); if(kind.compareTo(GREENTEA)==0) {tKind = new GreenTea();} if(kind.compareTo(REDTEA)==0) {tKind = new RedTea();} if(size.compareTo(SUPERCUP==0) {tSize = new SuperCup(tKind);} if(size.compareTo(MEDIUMCUP)==0) {tSize = new MediumCup(tKind);} float price = tSize.getPrice();
软件设计模式与体系结构
3.4 桥接模式
主讲教师:陈星 助教:曾雪娥、刘艳萍等 福州大学 数学与计算机科学学院 福建省网络计算与智能信息处理重点实验室
引言
• 考虑一个自动茶水销售机的实例,该机器销售的茶水在杯子的体积上分为中杯 和大杯,在茶叶品种上分为红茶和绿茶,这里要进行销售程序设计。为了简单 起见,假设程序的主要功能为根据茶杯的大小与茶的种类计算一杯茶的销售价 格。初始设计如图3.37所示。
桥接模式应用实例
• 考虑一个自动茶水销售机的实例,该机器销售的茶水在杯子的体积上分为中杯 和大杯,在茶叶品种上分为红茶和绿茶,这里要进行销售程序设计。为了简单 起见,假设程序的主要功能为根据茶杯的大小与茶的种类计算一杯茶的销售价 格。使用桥接模式进行设计。用户通过选择“Super Cup”或者”Medium Cup”,及“Red Tea”或“Green Tea”获得一杯茶的价格。
• 桥接模式是指将抽象部分与它的实现部分分离,使它们可以独立地变化。桥接 模式的设计类图如图3.43所示。
Abstraction abstraction; Implementor implementor; String imp = getImplementor(); if(imp.compareTo(A)==0) {implementor = new ConcreteImplementorA();} if(imp.compareTo(B)==0) {implementor = new ConcreteImplementorB();} abstraction = new RefinedAbstraction(implementor); abstraction.OperationImp();
GeoForm g; Measure m; String form = getGeoForm(); String measure = getMeasure(); if(form.compareTo(Cube)==0) {g = new Cube();} if(form.compareTo(EllipseCylinder)==0) {g = new EllipseCylinder();} if(measure.compareTo(MeterMeasure)==0) {m = new MeterMeasure(g);} if(measure.compareTo(FootMeasure)==0) {m = new FootMeasure(g);} float volume = m.findVolume();
由此看来,在所设计的程序中有几个维度时,将抽象部分与实现部分分离的 设计,可以使程序独立、互不影响地增加类,而不需要改变甚至不需要重新 编译已经存在的类。
7
桥接模式的概念和机制
• 桥接模式是指将抽象部分与它的实现部分分离,使它们可以独立地变化。桥接 模式的设计类图如图3.43所示。
8
桥接模式的概念和机制
13
关于桥接模式的讨论
• 关于椭圆,Java API 中的Ellipse2D 以及两个实现类Ellipse2D.double与 Ellipse2D.float都是以左上角坐标与长、宽声明一个椭圆。但是数学工作者习 惯于使用椭圆中心与长、短半轴声明一个椭圆。因此有必要定义一个新的椭圆 接口,带有两个不同的实现类EllipseByCorner与EllipseByCenter,并且希 望这两个椭圆类都有画椭圆的功能。但是画图是一项单独的功能,不适合放在 EllipseByCorner与EllipseByCenter中,因此,将画椭圆图的功能单独封装 在EllipseDrawer类的结构体中。设计类图如图3.47所示。
通过该设计,将椭圆的声明与具体的椭圆画法分开了。那么现在该设计是否 遵循桥接模式的设计?
14
本周课程作业
• 开发一个跨平台视频播放器,可以在不同操作系统平台(如Windows、Linux、 UNIX等)上播放多种格式的视频文件,如MPEG、RMVB、AVI、WMV等常见 视频格式。现使用桥接模式设计该播放器。
4
引言
• 现在考虑将整个类拆分成两个类的结构体进行重新设计,如图3.40所示。
5
引言
• 因为新的设计将抽象部分与实现部分分离开来,所以比较容易在茶的品种和茶 杯的体积方面增加新的类。例如,若增加一个类BlackTea,只需增加一个 Teakind的子类,如图3.41所示.
6
引言
• 如果又要增加一个新的销售小杯茶水的功能,则只需要增加一个TeaSize的子 类SmallCup类即可,如图3.42所示。
以上设计的缺点是具有重复性且缺乏可扩展性。
2
引言
• 按照茶杯的大小分类,可以设计出如图3.38所示的类的结构体。
3
引言
• 现在,如果需要添加一个新的茶叶品种,如BlackTea,则需要分别在MedTea 和SuperTea的子类位置添加BlackTea类,如图3.39所示
以上设计确实仍符合开闭原则,但是添加一个类需要同时在两个地方进行操 作,还是比较麻烦。
•
现欲实现一个图像浏览系统,要求该系统能够显示BMP、JPEG和GIF三种格式 的文件,并且能够在Windows和Linux两种操作系统上运行。系统首先将BMP、 JPEG和GIF三种格式的文件解析为像素矩阵,然后将像素矩阵显示在屏幕上。 系统必须具有较好的扩展性以支持新的文件格式和操作系统。为满足上述需求 并减少所需生成的子类数目,采用桥接设计模式,请画出类图。
15
11
桥接模式应用实例
• 在不同的度量下体积计算问题。假如要计算在米(Meter)与英尺(Foot)度 量下的空间几何体的体积问题,利用桥接模式进行设计。
12
ቤተ መጻሕፍቲ ባይዱ
桥接模式应用实例
• 在不同的度量下体积计算问题。假如要计算在米(Meter)与英尺(Foot)度 量下的空间几何体的体积问题,利用桥接模式进行设计。
10
桥接模式应用实例
• 假设程序的主要功能为根据茶杯的大小与茶的种类计算一杯茶的销售价格,使 用桥接模式进行设计。
String size = getTeaSize(); String kind = getTeaKind(); if(kind.compareTo(GREENTEA)==0) {tKind = new GreenTea();} if(kind.compareTo(REDTEA)==0) {tKind = new RedTea();} if(size.compareTo(SUPERCUP==0) {tSize = new SuperCup(tKind);} if(size.compareTo(MEDIUMCUP)==0) {tSize = new MediumCup(tKind);} float price = tSize.getPrice();
软件设计模式与体系结构
3.4 桥接模式
主讲教师:陈星 助教:曾雪娥、刘艳萍等 福州大学 数学与计算机科学学院 福建省网络计算与智能信息处理重点实验室
引言
• 考虑一个自动茶水销售机的实例,该机器销售的茶水在杯子的体积上分为中杯 和大杯,在茶叶品种上分为红茶和绿茶,这里要进行销售程序设计。为了简单 起见,假设程序的主要功能为根据茶杯的大小与茶的种类计算一杯茶的销售价 格。初始设计如图3.37所示。