《JAVA与模式》之桥梁模式
在阎宏博士的《JAVA与模式》一书中开头是这样描述桥梁(Bridge)模式的:
桥梁模式是对象的结构模式。又称为柄体(Handle and Body)模式或接口(Interface)模式。桥梁模式的用意是“将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化”。
桥梁模式的用意
桥梁模式虽然不是一个使用频率很高的模式,但是熟悉这个模式对于理解面向对象的设计原则,包括“开-闭”原则以及组合/聚合复用原则都很有帮助。理解好这两个原则,有助于形成正确的设计思想和培养良好的设计风格。
桥梁模式的用意是“将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化”。这句话很短,但是第一次读到这句话的人很可能都会思考良久而不解其意。
这句话有三个关键词,也就是抽象化、实现化和脱耦。理解这三个词所代表的概念是理解桥梁模式用意的关键。
- 抽象化
从众多的事物中抽取出共同的、本质性的特征,而舍弃其非本质的特征,就是抽象化。例如苹果、香蕉、生梨、
桃子等,它们共同的特性就是水果。得出水果概念的过程,就是一个抽象化的过程。要抽象,就必须进行比较,没有比较就无法找到在本质上共同的部分。共同特征是指那些能把一类事物与他类事物区分开来的特征,这些具有区分作用的特征又称本质特征。因此抽取事物的共同特征就是抽取事物的本质特征,舍弃非本质的特征。
所以抽象化的过程也是一个裁剪的过程。在抽象时,同与不同,决定于从什么角度上来抽象。抽象的角度取决于分析问题的目的。
通常情况下,一组对象如果具有相同的特征,那么它们就可以通过一个共同的类来描述。如果一些类具有相同的特征,往往可以通过一个共同的抽象类来描述。
- 实现化
抽象化给出的具体实现,就是实现化。
一个类的实例就是这个类的实例化,一个具体子类是它的抽象超类的实例化。
- 脱耦
所谓耦合,就是两个实体的行为的某种强关联。而将它们的强关联去掉,就是耦合的解脱,或称脱耦。在这里,脱耦是指将抽象化和实现化之间的耦合解脱开,或者说是将它们之间的强关联改换成弱关联。
所谓强关联,就是在编译时期已经确定的,无法在运行时期动态改变的关联;所谓弱关联,就是可以动态地确定并且可以在运行时期动态地改变的关联。显然,在Java语言中,继承关系是强关联,而聚合关系是弱关联。
将两个角色之间的继承关系改为聚合关系,就是将它们之间的强关联改换成为弱关联。因此,桥梁模式中的所谓脱耦,就是指在一个软件系统的抽象化和实现化之间使用聚合关系而不是继承关系,从而使两者可以相对独立地变化。这就是桥梁模式的用意。
桥梁模式的结构
下图所示就是一个实现了桥梁模式的示意性系统的结构图:
可以看出,这个系统含有两个等级结构:
一、由抽象化角色和修正抽象化角色组成的抽象化等级结构。
二、由实现化角色和两个具体实现化角色所组成的实现化等级结构。
桥梁模式所涉及的角色有:
● 抽象化(Abstraction)角色:抽象化给出的定义,并保存一个对实现化对象的引用。
● 修正抽象化(RefinedAbstraction)角色:扩展抽象化角色,改变和修正父类对抽象化的定义。
● 实现化(Implementor)角色:这个角色给出实现化角色的接口,但不给出具体的实现。必须指出的是,这个接口不一定和抽象化角色的接口定义相同,实际上,这两个接口可以非常不一样。实现化角色应当只给出底层操作,而抽象化角色应当只给出基于底层操作的更高一层的操作。
● 具体实现化(ConcreteImplementor)角色:这个角色给出实现化角色接口的具体实现。
抽象化角色就像是一个水杯的手柄,而实现化角色和具体实现化角色就像是水杯的杯身。手柄控制杯身,这就是此模式别名“柄体”的来源。
对象是对行为的封装,而行为是由方法实现的。在这个示意性系统里,抽象化等级结构中的类封装了operation()方法;而实现化等级结构中的类封装的是operationImpl()方法。当然,在实际的系统中往往会有多于一个的方法。
抽象化等级结构中的方法通过向对应的实现化对象的委派实现自己的功能,这意味着抽象化角色可以通过向不同的实现化对象委派,来达到动态地转换自己的功能的目的。
源代码
抽象化角色类,它声明了一个方法operation(),并给出了它的实现。这个实现是通过向实现化对象的委派(调用operationImpl()方法)实现的。
public abstract class Abstraction { protected Implementor impl; public Abstraction(Implementor impl){
this.impl = impl;
}
//示例方法
public void operation(){ impl.operationImpl();
}
}
修正抽象化角色
public class RefinedAbstraction extends Abstraction { public RefinedAbstraction(Implementor impl) {
super(impl);
}
//其他的操作方法
public void otherOperation(){ }
}
实现化角色
public abstract class Implementor {
/**
* 示例方法,实现抽象部分需要的某些具体功能
*/
public abstract void operationImpl();
}
具体实现化角色
public class ConcreteImplementorA extends Implementor { @Override
public void operationImpl() {
//具体操作
} }
public class ConcreteImplementorB extends Implementor { @Override
public void operationImpl() {
//具体操作
} }
一般而言,实现化角色中的每个方法都应当有一个抽象化角色中的某一个方法与之对应,但是反过来则不一定。换言之,抽象化角色的接口比实现化角色的接口宽。抽象化角色除了提供与实现化角色相关的方法之外,还有可能提供其他的方法;而实现化角色则往往仅为实现抽象化角色的相关行为而存在。
使用场景
考虑这样一个实际的业务功能:发送提示消息。基本上所有带业务流程处理的系统都会有这样的功能,比如OA上有尚未处理完毕的文件,需要发送一条消息提示他。
从业务上看,消息又分成普通消息、加急消息和特急消息多种,不同的消息类型,业务功能处理是不一样的,比如加急消息是在消息上添加加急,而特急消息除了添加特急外,还会做一条催促的记录,多久不完成会继续催促;从发送消息的手段上看,又有系统内短消息、手机短信息、邮件等。
不使用模式的解决方案
实现发送普通消息
先考虑实现一个简单点的版本,比如,消息只是实现发送普通消息,发送的方式只实现系统内短消息和邮件。其他的功能,等这个版本完成后,再继续添加。
源代码
消息的统一接口
public interface Message {
/**
* 发送消息
* @param message 要发送消息的内容
* @param toUser 消息的接受者
*/
public void send(String message , String toUser);
}
系统内短消息示例类
public class CommonMessageSMS implements Message { @Override
public void send(String message, String toUser) { System.out.println("使用系统内短消息的方法,发送消息'"+message+"'给"+toUser);
} }
邮件消息示例类
public class CommonMessageEmail implements Message{ @Override
public void send(String message, String toUser) { System.out.println("使用邮件短消息的方法,发送消息'"+message+"'给"+toUser);
} }
实现发送加急消息
发送加急消息同样有两种方式,系统内短消息和邮件方式。但是加急消息的实现不同于普通消息,加急消息会自动在消息上添加加急,然后在再发送消息;另外加急消息会提供监控的方法,让客户端可以随时通过这个方法来了解对于加急消息的处理进度。比如,相应的人员是否接收到这个信息,相应的处理工作是否已经展开。因此加急消息需要扩展出一个新的接口,除了基本的发送消息的功能,还需要添加监控功能。
aaarticlea/png;base64,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" alt="" />
源代码
加急消息的接口
public interface UrgencyMessage extends Message {
/**
* 监控指定消息的处理过程
* @param messageId 被监控的消息编号
* @return 监控到的消息的处理状态
*/
public Object watch(String messageId);
}
系统内加急短消息示例类
public class UrgencyMessageSMS implements UrgencyMessage { @Override
public Object watch(String messageId) {
// 根据消息id获取消息的状态,组织成监控的数据对象,然后返回
return null;
} @Override
public void send(String message, String toUser) { message = "加急:" + message;
System.out.println("使用系统内短消息的方法,发送消息'"+message+"'给"+toUser);
} }
邮件加急短消息示例类
public class UrgencyMessageEmail implements UrgencyMessage { @Override
public Object watch(String messageId) {
// 根据消息id获取消息的状态,组织成监控的数据对象,然后返回
return null;
} @Override
public void send(String message, String toUser) { message = "加急:" + message;
System.out.println("使用邮件短消息的方法,发送消息'"+message+"'给"+toUser);
} }
实现发送特急消息
特急消息不需要查看处理进程,只有没有完成,就直接催促,也就是说,对于特急消息,在普通消息的处理基础上,需要添加催促的功能。
aaarticlea/png;base64,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" alt="" />
观察上面的系统结构图,会发现一个很明显的问题,那就是通过这种继承的方式来扩展消息处理,会非常不方便。实现加急消息处理的时候,必须实现系统内短消息和邮件两种处理方式,因为业务处理可能不同,在实现特急消息处理的时候,又必须实现系统内短信息和邮件两种处理方式。这意味着,以后每次扩展一下消息处理,都必须要实现这两种处理方式,这还不算完,如果要添加新的实现方式呢?
添加发送手机消息的处理方式
如果要添加一种新的发送消息的方式,是需要在每一种抽象的具体实现中,都添加发送手机消息的处理的。也就是说,发送普通消息、加急消息和特急消息的处理,都可以通过手机来发送。
aaarticlea/png;base64,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" alt="" />
采用通过继承来扩展的实现方式,有个明显的缺点,扩展消息的种类不太容易。不同种类的消息具有不同的业务,也就是有不同的实现,在这种情况下,每一种类的消息,需要实现所有不同的消息发送方式。更可怕的是,如果要新加入一种消息的发送方式,那么会要求所有的消息种类都有加入这种新的发送方式的实现。
那么究竟该如何才能既实现功能,又可以灵活地扩展呢?
使用桥梁模式来解决问题
根据业务的功能要求,业务的变化具有两个维度,一个维度是抽象的消息,包括普通消息、加急消息和特急消息,这几个抽象的消息本身就具有一定的关系,加急消息和特急消息会扩展普通消息;另一个维度是在具体的消息发送方式上,包括系统内短消息、邮件和手机短消息,这几个方式是平等的,可被切换的方式。
现在出现问题的根本原因,就在于消息的抽象和实现是混杂在一起的,这就导致了一个纬度的变化会引起另一个纬度进行相应的变化,从而使得程序扩展起来非常困难。
要想解决这个问题,就必须把这两个纬度分开,也就是将抽象部分和实现部分分开,让它们相互独立,这样就可以实现独立的变化,使扩展变得简单。抽象部分就是各个消息的类型所对应的功能,而实现部分就是各种发送消息的方式。按照桥梁模式的结构,给抽象部分和实现部分分别定义接口,然后分别实现它们就可以了。
aaarticlea/png;base64,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" alt="" />
源代码
抽象消息类
public abstract class AbstractMessage {
//持有一个实现部分的对象
MessageImplementor impl;
/**
* 构造方法,传入实现部分的对象
* @param impl 实现部分的对象
*/
public AbstractMessage(MessageImplementor impl){
this.impl = impl;
}
/**
* 发送消息,委派给实现部分的方法
* @param message 要发送消息的内容
* @param toUser 消息的接受者
*/
public void sendMessage(String message , String toUser){
this.impl.send(message, toUser);
}
}
普通消息类
public class CommonMessage extends AbstractMessage { public CommonMessage(MessageImplementor impl) {
super(impl);
}
@Override
public void sendMessage(String message, String toUser) {
// 对于普通消息,直接调用父类方法,发送消息即可
super.sendMessage(message, toUser);
}
}
加急消息类
public class UrgencyMessage extends AbstractMessage { public UrgencyMessage(MessageImplementor impl) {
super(impl);
}
@Override
public void sendMessage(String message, String toUser) {
message = "加急:" + message;
super.sendMessage(message, toUser);
}
/**
* 扩展自己的新功能,监控某消息的处理状态
* @param messageId 被监控的消息编号
* @return 监控到的消息的处理状态
*/
public Object watch(String messageId) {
// 根据消息id获取消息的状态,组织成监控的数据对象,然后返回
return null;
}
}
实现发送消息的统一接口
public interface MessageImplementor {
/**
* 发送消息
* @param message 要发送消息的内容
* @param toUser 消息的接受者
*/
public void send(String message , String toUser);
}
系统内短消息的实现类
public class MessageSMS implements MessageImplementor { @Override
public void send(String message, String toUser) { System.out.println("使用系统内短消息的方法,发送消息'"+message+"'给"+toUser);
} }
邮件短消息的实现类
public class MessageEmail implements MessageImplementor { @Override
public void send(String message, String toUser) {
System.out.println("使用邮件短消息的方法,发送消息'"+message+"'给"+toUser);
} }
客户端类
public class Client { public static void main(String[] args) {
//创建具体的实现对象
MessageImplementor impl = new MessageSMS();
//创建普通消息对象
AbstractMessage message = new CommonMessage(impl);
message.sendMessage("加班申请速批","李总"); //将实现方式切换成邮件,再次发送
impl = new MessageEmail();
//创建加急消息对象
message = new UrgencyMessage(impl);
message.sendMessage("加班申请速批","李总");
} }
观察上面的例子会发现,采用桥梁模式来实现,抽象部分和实现部分分离开了,可以相互独立的变化,而不会相互影响。因此在抽象部分添加新的消息处理(特急消息),对发送消息的实现部分是没有影响的;反过来增加发送消息的方式(手机短消息),对消息处理部分也是没有影响的。
桥梁模式的优点
● 分离抽象和实现部分
桥梁模式分离了抽象部分和实现部分,从而极大地提供了系统的灵活性。让抽象部分和实现部分独立出来,分别定义接口,这有助于对系统进行分层,从而产生更好的结构化的系统。
● 更好的扩展性
桥梁模式使得抽象部分和实现部分可以分别独立地扩展,而不会相互影响,从而大大提高了系统的可扩展性。
桥梁模式在Java中的使用
桥梁模式在Java应用中的一个非常典型的例子就是JDBC驱动器。JDBC为所有的关系型数据库提供一个通用的界面。一个应用系统动态地选择一个合适的驱动器,然后通过驱动器向数据库引擎发出指令。这个过程就是将抽象角色的行为委派给实现角色的过程。
抽象角色可以针对任何数据库引擎发出查询指令,因为抽象角色并不直接与数据库引擎打交道,JDBC驱动器负责这个底层的工作。由于JDBC驱动器的存在,应用系统可以不依赖于数据库引擎的细节而独立地演化;同时数据库引擎也可以独立于应用系统的细节而独立的演化。两个独立的等级结构如下图所示,左边是JDBC API的等级结构,右边是JDBC驱动器的等级结构。应用程序是建立在JDBC API的基础之上的。
应用系统作为一个等级结构,与JDBC驱动器这个等级结构是相对独立的,它们之间没有静态的强关联。应用系统通过委派与JDBC驱动器相互作用,这是一个桥梁模式的例子。
JDBC的这种架构,把抽象部分和具体部分分离开来,从而使得抽象部分和具体部分都可以独立地扩展。对于应用程序而言,只要选用不同的驱动,就可以让程序操作不同的数据库,而无需更改应用程序,从而实现在不同的数据库上移植;对于驱动程序而言,为数据库实现不同的驱动程序,并不会影响应用程序。
《JAVA与模式》之桥梁模式的更多相关文章
- 【设计模式】 模式PK:策略模式VS桥梁模式
1.概述 我们先来看两种模式的通用类图. 两者之间确实很相似.如果把策略模式的环境角色变更为一个抽象类加一个实现类,或者桥梁模式的抽象角色未实现,只有修正抽象化角色,想想看,这两个类图有什么地方不一样 ...
- 策略模式 VS 桥梁模式
这对冤家终于碰头了,策略模式与桥梁模式是如此相似,简直就是孪生兄弟,要把它们两个分开需要花费大量智力,我们来看看两者的通用类图,如图33-1所示. 图33-1 策略模式(左)和桥梁模式(右)通用类图 ...
- Java设计模式(13)——结构型模式之桥梁模式(Bridge)
一.概述 概念 将抽象与实现脱耦,使得抽象和实现可以独立运行 UML图 角色: 角色关系 二.实践 按照上面的角色建立相应的类 抽象化角色 /** * 抽象化角色 * * @author Admini ...
- JAVA设计模式之桥梁模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述桥梁(Bridge)模式的: 桥梁模式是对象的结构模式.又称为柄体(Handle and Body)模式或接口(Interface)模式. ...
- java 设计模式 之 桥梁模式
桥梁模式:将抽象和实现解耦,使两者可以独立的变化.解释:将两个有组合关系,强耦合的对象,各自抽象然后解耦.(类关系图看https://www.cnblogs.com/blogxiao/p/951388 ...
- java设计模式之桥梁模式(Bridge)
1.桥梁模式 与 策略模式 非常相似 (其实很多设计模式都相似,因为所有的模式都是按照设计原则 而设计出来的,设计原则就相当于武功的心法,设计模式就是招式,只要心法过硬,就可以无招胜有招了.) 这里也 ...
- 桥梁模式(Bridge Pattern)
桥梁模式是对象的结构模式.又称为柄体(Handle and Body)模式或接口(Interface)模式.桥梁模式的用意是“将抽象化(Abstraction)与实现化(Implementation) ...
- 设计模式 桥梁模式 JDBC
桥梁模式是对象的结构模式.又称为柄体(Handle and Body)模式或接口(Interface)模式.桥梁模式的用意是“将抽象化(Abstraction)与实现化(Implementation) ...
- 《JAVA设计模式》之桥接模式(Bridge)
在阎宏博士的<JAVA与模式>一书中开头是这样描述桥梁(Bridge)模式的: 桥梁模式是对象的结构模式.又称为柄体(Handle and Body)模式或接口(Interface)模式. ...
随机推荐
- tmux配置与用法整理
tmux常用命令与快捷键 http://www.111cn.net/sys/linux/59058.htm http://www.360doc.com/content/13/0709/13/13047 ...
- Maximum profit of stocks
https://github.com/Premiumlab/Python-for-Algorithms--Data-Structures--and-Interviews/blob/master/Moc ...
- 2018.10.19 NOIP模拟 硬币(矩阵快速幂优化dp)
传送门 不得不说神仙出题人DZYODZYODZYO出的题是真的妙. f[i][j][k]f[i][j][k]f[i][j][k]表示选的硬币最大面值为iii最小面值不小于jjj,总面值为kkk时的选法 ...
- 2018.10.14 loj#516. DP 一般看规律(启发式合并)
传送门 注意到一种颜色改了之后就不能改回去了. 因此可以启发式合并. 每次把小的合并给大的. 这样每个数最多被合并logloglog次. 如果维护一棵比较下标的平衡树的话,对于答案有贡献的就是每个数与 ...
- flex 分页
<?xml version="1.0" encoding="utf-8"?><s:Group xmlns:fx="http://ns ...
- Hi,everybod,搬家了
Hi,小伙伴们,我的博客已经搬家到了GitHub,地址是:http://wxb.github.io/Blog/ 博客园以后就不维护了,有什么问题咱们GitHub上讨论啦,可以在:https://git ...
- (转)C#静态方法使用经验浅谈
转自:http://developer.51cto.com/art/200908/147734.htm C#静态方法有什么弊端? 我们在实际的开发过程中会注意到C#静态方法对于我们程序的影响,那么有哪 ...
- Eclipse代码提示功能设置
1. 解决实例化时自动补全不必要的单词问题 2. 以MyEclipse 6.5重新配图 鉴 于网上的批评之声甚大,我只想说明我的想法:这样的增强代码提示,最终是用来辅助我们 ...
- memcached分布式缓存系统
在数据驱动的Web开发中,经常要重复从数据库中取出相同的数据,这种重复极大的增加了数据库负载.缓存是解决这个问题的好办法.但是ASP.NET中的虽然已经可以实现对页面局部进行缓存,但还是不够灵活.此时 ...
- express session
一.什么是session? 最近在学习node.js 的express框架,接触到了关于session方面的内容.翻阅了一些的博客,学到了不少东西,发现一篇博文讲的很好,概念内容摘抄如下: Sessi ...