版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第14章章 桥梁模式桥梁模式(Bridge)(柄体柄体(Handle and Body)模式或接口模式或接口(Interface)模式)模式)发送提示消息发送提示消息 从业务上看,消息又分成普通消息、加从业务上看,消息又分成普通消息、加急消息和特急消息多种急消息和特急消息多种 从发送消息的手段上看,又有系统内短从发送消息的手段上看,又有系统内短消息、手机短消息、邮件等等消息、手机短消息、邮件等等 现在要实现这样的发送提示消息的功能,现在要实现这样的发送提示消息的功能,该如何实现呢?该如何实现呢?不用模式的解决不用模式的解决方案(方案(简化版简化版)不用模式的解决不用模式的解决方案(方案(实现
2、发送加急消息实现发送加急消息)有何问题(有何问题(继续添加特急消息的处理继续添加特急消息的处理)不用模式的解决不用模式的解决方案方案 通过继承扩展的方式实现的明显缺点:扩展消息通过继承扩展的方式实现的明显缺点:扩展消息的种类不太容易,不同种类的消息具有不同的业的种类不太容易,不同种类的消息具有不同的业务(不同实现),在这种情况下,每个种类的消务(不同实现),在这种情况下,每个种类的消息,需要实现所有不同的消息发送方式息,需要实现所有不同的消息发送方式 如果要新加入一种消息的发送方式,那么会要求如果要新加入一种消息的发送方式,那么会要求所有的消息种类,都要加入这种新的发送方式的所有的消息种类,都
3、要加入这种新的发送方式的实现。实现。蜡笔与毛笔的故事蜡笔与毛笔的故事笔类型:笔类型:大、中、小。大、中、小。颜色种类:颜色种类:12蜡笔与毛笔的故事蜡笔与毛笔的故事蜡笔与毛笔的故事蜡笔与毛笔的故事 把乘法运算把乘法运算31236改为了加法运算改为了加法运算31215 蜡笔和毛笔的蜡笔和毛笔的关键关键一个区别就在于笔和颜色一个区别就在于笔和颜色是否能够分离是否能够分离(能否脱耦能否脱耦) 蜡笔的颜色和蜡笔本身是分不开的,所以就蜡笔的颜色和蜡笔本身是分不开的,所以就造成必须使用造成必须使用36支色彩、大小各异的蜡笔来支色彩、大小各异的蜡笔来绘制图画。而毛笔与颜料能够很好的脱耦,绘制图画。而毛笔与颜
4、料能够很好的脱耦,各自独立变化,便简化了操作各自独立变化,便简化了操作绘绘 图图 系系 统统 如果要绘制矩形、圆形、椭圆、正方形,我们如果要绘制矩形、圆形、椭圆、正方形,我们至少需要至少需要4个形状类,但是如果绘制的图形需个形状类,但是如果绘制的图形需要具有不同的颜色,如红色、绿色、蓝色等。要具有不同的颜色,如红色、绿色、蓝色等。 设计方案?设计方案? 第一种设计方案第一种设计方案是为每一种形状都提供一是为每一种形状都提供一套各种颜色的版本。套各种颜色的版本。第二种设计方案第二种设计方案是根据实际需要对形状和是根据实际需要对形状和颜色进行组合。颜色进行组合。 12绘绘 图图 系系 统统 桥接模
5、式桥接模式对于有对于有两个变化维度两个变化维度(即两个变化的原因)(即两个变化的原因)的系统,采用的系统,采用方案二方案二来进行设计系统中类的来进行设计系统中类的个数更少,且系统扩展更为方便。个数更少,且系统扩展更为方便。设计方案二即是桥接模式的应用。设计方案二即是桥接模式的应用。桥接模式将桥接模式将继承关系转换为关联关系继承关系转换为关联关系,从而,从而降低降低了类与类之间的了类与类之间的耦合耦合,减少代码编写量。,减少代码编写量。桥接模式定义桥接模式定义将将抽象部分与它的实现部分分离抽象部分与它的实现部分分离,使它们,使它们都可以独立地变化都可以独立地变化Bridge(桥梁桥梁)模式模式U
6、ML抽象化抽象化(Abstraction)角色角色:通常在这个对象里面,:通常在这个对象里面,要维护一个实现部分的对象引用,在抽象对象里面的要维护一个实现部分的对象引用,在抽象对象里面的方法,需要调用实现部分的对象来完成。这个对象里方法,需要调用实现部分的对象来完成。这个对象里面的方法,通常都是跟具体的业务相关的方法面的方法,通常都是跟具体的业务相关的方法修正修正(扩充扩充)抽象化抽象化(Refined Abstraction)角色角色:扩展:扩展抽象部分的接口。通常在这些对象里面,定义跟实际抽象部分的接口。通常在这些对象里面,定义跟实际业务相关的方法,这些方法的实现通常会使用业务相关的方法,
7、这些方法的实现通常会使用Abstraction中定义的方法,也可能需要调用实现部分中定义的方法,也可能需要调用实现部分的对象来完成的对象来完成实现化实现化(Implementor)角色角色:该接口不一定和:该接口不一定和抽 象 化 角 色 的 接 口 定 义 相 同 。 通 常 由抽 象 化 角 色 的 接 口 定 义 相 同 。 通 常 由Implementor接口提供基本的操作,而接口提供基本的操作,而Abstraction里面定义的是基于这些基本操作的里面定义的是基于这些基本操作的业务方法,即业务方法,即Abstraction定义基于这些基本操定义基于这些基本操作的较高层次的操作。作的较
8、高层次的操作。具体实现化具体实现化(Concrete Implementor)角色角色:真:真正实现正实现Implementor接口的对象接口的对象理解桥接模式理解桥接模式重点:如何将重点:如何将抽象化抽象化与与实现化脱耦实现化脱耦,使得二者可以独,使得二者可以独立地变化立地变化抽象化抽象化:抽象化就是忽略一些信息,把不同的实体:抽象化就是忽略一些信息,把不同的实体当作同样的实体对待。在面向对象中,当作同样的实体对待。在面向对象中,将对象的共将对象的共同性质抽取出来形成类的过程同性质抽取出来形成类的过程即为抽象化的过程。即为抽象化的过程。 实现化实现化:针对抽象化给出的具体实现,就是实现化针对
9、抽象化给出的具体实现,就是实现化,抽象化与实现化是一对互逆的概念,实现化产生的抽象化与实现化是一对互逆的概念,实现化产生的对象比抽象化更具体,是对抽象化事物的进一步具对象比抽象化更具体,是对抽象化事物的进一步具体化的产物。体化的产物。理解桥接模式理解桥接模式脱耦脱耦:脱耦就是将抽象化和实现化之间的耦合解:脱耦就是将抽象化和实现化之间的耦合解脱开,或者说是将它们之间的强关联改换成弱关脱开,或者说是将它们之间的强关联改换成弱关联,将两个角色之间的联,将两个角色之间的继承关系改为关联关系继承关系改为关联关系。桥接模式中的所谓脱耦,就是指在一个软件系统桥接模式中的所谓脱耦,就是指在一个软件系统的抽象化
10、和实现化之间的抽象化和实现化之间使用关联关系(组合或者使用关联关系(组合或者聚合关系)而不是继承关系聚合关系)而不是继承关系,从而使两者可以相,从而使两者可以相对独立地变化,这就是桥接模式的用意。对独立地变化,这就是桥接模式的用意。 public class Abstraction protected Implementor implementor; public void SetImplementor(Implementor imp) implementor = imp; virtual public void Operation() implementor.OperationImp();
11、public class RefinedAbstraction extends Abstraction public void OperationImp() implementor.OperationImp(); /其它代码其它代码 public abstract class Implementor public abstract void OperationImp(); public class ConcreteImplementorA extends Implementor public void OperationImp() System.out.println(ConcreteImpl
12、ementorA Operation); public class ConcreteImplementorB extends Implementor public void OperationImp() Console.WriteLine(ConcreteImplementorB Operation); public class Client public static void main( String args ) Abstraction abstraction = new RefinedAbstraction(); abstraction.SetImplementor(new Concr
13、eteImplementorA(); abstraction.Operation(); abstraction.SetImplementor(new ConcreteImplementorB(); abstraction.Operation(); 使用桥接模式使用桥接模式重写重写发送提示消息发送提示消息/实现发送消息的统一接口实现发送消息的统一接口public interface MessageImplementor /* 发送消息发送消息 * param message 要发送的消息内容要发送的消息内容 * param toUser 消息发送的目的人员消息发送的目的人员 */ public
14、void send(String message,String toUser);/短消息的方式发送消息短消息的方式发送消息public class MessageSMS implements MessageImplementor public void send(String message, String toUser) System.out.println(“使用站内短消息的方式,发使用站内短消息的方式,发 送消息送消息+message+给给+toUser); /以以Email的方式发送消息的方式发送消息public class MessageEmail implements Messag
15、eImplementor public void send(String message, String toUser) System.out.println(使用使用Email的方式,发送消的方式,发送消 息息+message+给给+toUser); /抽象的消息对象抽象的消息对象public abstract class AbstractMessage protected MessageImplementor impl;/持有一个实现部持有一个实现部分的对象分的对象 /传入实现部分的对象传入实现部分的对象 public AbstractMessage(MessageImplementor
16、impl) this.impl = impl; /发送消息,转调实现部分的方法发送消息,转调实现部分的方法 public void sendMessage(String message,String toUser) this.impl.send(message, toUser); /扩展抽象的消息接口,普通消息的实现扩展抽象的消息接口,普通消息的实现public class CommonMessage extends AbstractMessage public CommonMessage(MessageImplementor impl) super(impl); public void se
17、ndMessage(String message, String toUser) /对于普通消息,什么都不干,直接调父类的方对于普通消息,什么都不干,直接调父类的方法,把消息发送出去就可以了法,把消息发送出去就可以了 super.sendMessage(message, toUser); /扩展抽象的消息接口,加急消息的实现扩展抽象的消息接口,加急消息的实现public class UrgencyMessage extends AbstractMessage public UrgencyMessage(MessageImplementor impl) super(impl); public v
18、oid sendMessage(String message, String toUser) message = 加急:加急:+message; super.sendMessage(message, toUser); /扩展自己的新功能:监控某消息的处理过程扩展自己的新功能:监控某消息的处理过程 * param messageId 被监控的消息的编号被监控的消息的编号 * return 包含监控到的数据对象包含监控到的数据对象 */ public Object watch(String messageId) /获取相应的数据,组织成监控的数据对象,然后返回获取相应的数据,组织成监控的数据对象,
19、然后返回 return null; 添加功能添加功能/新的特急消息的处理类新的特急消息的处理类public class SpecialUrgencyMessage extends AbstractMessage public SpecialUrgencyMessage(MessageImplementor impl) super(impl); public void hurry(String messageId) /执行催促的业务,发出催促的信息执行催促的业务,发出催促的信息 public void sendMessage(String message, String toUser) mess
20、age = 特急:特急:+message; super.sendMessage(message, toUser); /还需要增加一条待催促的信息还需要增加一条待催促的信息 添加功能添加功能/使用手机短消息的方式发送消息的实现,示例使用手机短消息的方式发送消息的实现,示例代码如下:代码如下:public class MessageMobile implements MessageImplementor public void send(String message, String toUser) System.out.println(使用手机短消息的方式,使用手机短消息的方式, 发送消息发送消息
21、+message+给给+toUser); public class Client public static void main(String args) /创建具体的实现对象创建具体的实现对象 MessageImplementor impl = new MessageSMS(); /创建一个普通消息对象创建一个普通消息对象 AbstractMessage m = new CommonMessage(impl); m.sendMessage(请喝一杯茶请喝一杯茶, 小李小李); /创建一个紧急消息对象创建一个紧急消息对象 m = new UrgencyMessage(impl); m.send
22、Message(请喝一杯茶请喝一杯茶, 小李小李); /创建一个特急消息对象创建一个特急消息对象 m = new SpecialUrgencyMessage(impl); m.sendMessage(请喝一杯茶请喝一杯茶, 小李小李); /把实现方式切换成手机短消息,然后再实现一遍把实现方式切换成手机短消息,然后再实现一遍 impl = new MessageMobile(); m = new CommonMessage(impl); m.sendMessage(请喝一杯茶请喝一杯茶, 小李小李); m = new UrgencyMessage(impl); m.sendMessage(请喝一
23、杯茶请喝一杯茶, 小李小李); m = new SpecialUrgencyMessage(impl); m.sendMessage(请喝一杯茶请喝一杯茶, 小李小李); 应用举例应用举例 有一个有一个CAD软件,可以画多种图形软件,可以画多种图形 同时支持多套绘图算法同时支持多套绘图算法设计方法一设计方法一设计方法二(设计方法二(应用应用Bridge模式)模式)应用举例应用举例 分析分析 图形图形Shape是一个抽象概念,它可以有许多具是一个抽象概念,它可以有许多具体化体化(变化点变化点1) 图形的显示图形的显示Drawing是图形的实现,它也可以是图形的实现,它也可以有许多套算法有许多套算
24、法(变化点变化点2) Bridge模式使用组合代替继承,避免了复杂的模式使用组合代替继承,避免了复杂的继承体系,使得两个变化点独立变化,互不影继承体系,使得两个变化点独立变化,互不影响响应用举例应用举例JAVA中的示例中的示例 在在AWT中的中的Peer架构就使用了桥接模式架构就使用了桥接模式 JDBC驱动程序也是桥接模式的应用之一。驱动程序也是桥接模式的应用之一。使用使用JDBC驱动程序的应用系统就是抽象角驱动程序的应用系统就是抽象角色,而所使用的数据库是实现角色。色,而所使用的数据库是实现角色。一个一个JDBC驱动程序可以动态地将一个特定类型驱动程序可以动态地将一个特定类型的数据库与一个的
25、数据库与一个Java应用程序绑定在一起,应用程序绑定在一起,从而实现抽象角色与实现角色的动态耦合从而实现抽象角色与实现角色的动态耦合桥接桥接模式优点模式优点离抽象接口及其实现部分离抽象接口及其实现部分。 桥接模式有时类似于多继承方案,但是桥接模式有时类似于多继承方案,但是多多继承方案违背类的单一职责原则继承方案违背类的单一职责原则(即一个(即一个类只有一个变化的原因),复用性比较差,类只有一个变化的原因),复用性比较差,而且多继承结构中类的个数非常庞大,而且多继承结构中类的个数非常庞大,桥桥接模式是比多继承方案更好的解决方法接模式是比多继承方案更好的解决方法桥接桥接模式优点模式优点桥接模式桥接
26、模式提高了系统的可扩充性提高了系统的可扩充性,在两个,在两个变化维度中任意扩展一个维度,都不需要变化维度中任意扩展一个维度,都不需要修改原有系统。修改原有系统。 实现细节对客户透明,可以对用户隐藏实实现细节对客户透明,可以对用户隐藏实现细节现细节。 桥接模式的引入会桥接模式的引入会增加系统的理解与设计增加系统的理解与设计难度难度,由于聚合关联关系建立在抽象层,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。要求开发者针对抽象进行设计与编程。桥接模式要求正确识别出系统中两个独立桥接模式要求正确识别出系统中两个独立变化的维度,因此变化的维度,因此其使用范围具有一定的其使用范围具有一
27、定的局限性局限性。 桥接模式缺点桥接模式缺点如果一个系统如果一个系统需要在构件的抽象化角色和具体化角需要在构件的抽象化角色和具体化角色之间增加更多的灵活性色之间增加更多的灵活性,避免在两个层次之间建立避免在两个层次之间建立静态的继承联系静态的继承联系,通过桥接模式可以使它们在抽象层,通过桥接模式可以使它们在抽象层建立一个关联关系。建立一个关联关系。抽象化角色和实现化角色可以以继承的方式独立扩抽象化角色和实现化角色可以以继承的方式独立扩展而互不影响展而互不影响,在程序运行时可以动态将一个抽象化,在程序运行时可以动态将一个抽象化子类的对象和一个实现化子类的对象进行组合,即系子类的对象和一个实现化子
28、类的对象进行组合,即系统需要对抽象化角色和实现化角色进行动态耦合。统需要对抽象化角色和实现化角色进行动态耦合。在什么情况下应当使用桥梁模式在什么情况下应当使用桥梁模式 一个类一个类存在两个独立变化的维度存在两个独立变化的维度,且这两个维度都,且这两个维度都需要进行扩展。需要进行扩展。虽然在系统中使用继承是没有问题的,但是由于抽虽然在系统中使用继承是没有问题的,但是由于抽象化角色和具体化角色需要独立变化,设计要求需象化角色和具体化角色需要独立变化,设计要求需要独立管理这两者。要独立管理这两者。对于那些对于那些不希望使用继承或因为多层次继承导致系不希望使用继承或因为多层次继承导致系统类的个数急剧增
29、加的系统统类的个数急剧增加的系统,桥接模式尤为适用。,桥接模式尤为适用。在什么情况下应当使用桥梁模式在什么情况下应当使用桥梁模式 共同点:共同点: 桥接和适配器都是让两个东西配合工作桥接和适配器都是让两个东西配合工作不同点不同点:出发点不同:出发点不同适配器:改变已有的两个接口,让他们相容。适配器:改变已有的两个接口,让他们相容。桥接模式:分离抽象化和实现,使两者的接桥接模式:分离抽象化和实现,使两者的接口可以不同,目的是分离口可以不同,目的是分离。适配器模式与桥接模式的区别适配器模式与桥接模式的区别适配器模式与桥接模式的联用适配器模式与桥接模式的联用 桥接模式和适配器模式用于设计的不同阶段,桥接模式和适配器模式用于设计的不同阶段,桥接模式用于系统的初步设计桥接模式用于系统的初步设计,对于存在两个独,对于存在两个独立变化维度的类可以将其分为抽象化和实现化两立变化维度的类可以将其分为抽象化和实现化两个角色,使它们可以分别进行变化;而在初步设个角色,使它们可以分别进行变化;而在初步设计完成之后,计完成之后,当发现系统与已有类无法协同工作当发现系统与已有类无法协同工作时,可以采用适配器模式时,可以采用适配器模式。但有时候在设计初期。但有时候在设计初期也需要考虑适配器模式,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030智慧农业设备行业技术发展现状市场需求竞争格局市场前景研究报告
- 2025-2030智慧农业科技创新项目投资风险评估报告
- 2025-2030智慧农业物联网行业市场供需平衡调研发展前景规划分析研究报告
- 2025-2030智慧农业物联网技术应用与产量提升分析研究报告
- 2025-2030智慧农业气象监测系统农民互动平台设计及技术投资分析
- 2025-2030智慧农业技术集成及产量提升路径与农村经济转型可行性研究报告
- 特大安全事故的题库及答案解析
- 钻井队安全培训考试题及答案解析
- 银行安全培训考试题及答案解析
- 中国平安公司岗前考试及答案解析
- 2025年果园租赁的合同范本
- 山东省东营市垦利区(五四制)2024-2025学年六年级下学期7月期末考试历史试卷(含答案)
- 计算机(第8版)网络2025模拟试卷核心考点考研考核试卷
- 清新福建魅力八闽课件
- 纤支镜吸痰护理规范
- 电气岗前安全培训教学课件
- (正式版)DB61∕T 5078-2023 《体育建筑工艺设计标准》
- 国家能源集团笔试试题及答案
- 安全体验馆培训内容课件
- 2025年会计师事务所招聘面试模拟题及解析
- 《冶金原理(第2版)》全套教学课件
评论
0/150
提交评论