现实中场景:发送提示消息
从业务上看,消息又分成普通消息、加急消息和特急消息多种,
不同的消息类型,业务功能处理是不一样的:
加急消息是在消息上添加加急,而特急消息除了添加特急外,还会做一条催促的记录,多久不完成会继续催促。
从发送消息的手段上看,又有系统内短消息、手机短消息、邮件等等。
考虑简单情况:
消息先只是实现发送普通消息,先实现系统内短消息和邮件。其它的功能
public interface Message {
public void send(String message,String toUser);
}
public class CommonMessageSMS implements Message{
public void send(String message, String toUser) {
System.out.println("使用站内短消息的方式,发送消息'" +message+"'给"+toUser);
}
}
public class CommonMessageEmail implements Message{
public void send(String message, String toUser) {
System.out.println("使用Email的方式,发送消息'" +message+"'给"+toUser);
}
}
添加发送加急消息的功能,也有两种发送的方式,同样是站内短消息和Email的方式。
public interface UrgencyMessage extends Message{
public Object watch(String messageId);
}
public class UrgencyMessageSMS implements UrgencyMessage{
public void send(String message, String toUser) {
message = "加急:"+message;
System.out.println("使用站内短消息的方式,发送消息'"
+message+"'给"+toUser);
}
public Object watch(String messageId) {
//获取相应的数据,组织成监控的数据对象,然后返回
return null;
}
}
public class UrgencyMessageEmail implements UrgencyMessage{
public void send(String message, String toUser) {
message = "加急:"+message;
System.out.println("使用Email的方式,发送消息'"
+message+"'给"+toUser);
}
public Object watch(String messageId) {
//获取相应的数据,组织成监控的数据对象,然后返回
return null;
}
}
对于特急消息,在普通消息的处理基础上,需要添加催促的功能。
如果要实现特急消息的功能,又要新继承一个借口 并且新增两个实现类
以上继承的方式实现的缺陷是:
扩展消息的种类不太容易,不同种类的消息具有不同的业务,也就是有不同的实现.
更可怕的是,如果要新加入一种消息的发送方式,那么会要求所有的消息种类,都要加入这种新的发送方式的实现。
桥接模式定义: 将抽象部分与它的实现部分分离,使它们都可以独立地变化。
应用桥接模式来解决的思路:
示例的变化具有两个纬度,一个纬度是抽象的消息这边,包括普通消息、加急消息和特急消息,另一个纬度为消息发送方式:包括站内短消息、Email和手机短信息。
Implementor:
定义实现部分的接口,提供基本操作
Abstraction:
抽象部分的接口。里面定义的是基于这些基本操作的业务方法,
RefinedAbstraction
扩展抽象部分的接口,通常在这些对象里面,定义跟实际业务相关的方法,
ConcreteImplementor:
真正实现Implementor接口的对象。
public interface Implementor {
public void operationImpl();
}
public abstract class Abstraction {
protected Implementor impl;
public Abstraction(Implementor impl){
this.impl = impl;
}
public void operation() {
impl.operationImpl();
}
}
public class ConcreteImplementorA implements Implementor {
public void operationImpl() {
//真正的实现
}
}
public class ConcreteImplementorB implements Implementor {
public void operationImpl() {
//真正的实现
}
}
public class RefinedAbstraction extends Abstraction {
public RefinedAbstraction(Implementor impl) {
super(impl);
}
/**
* 示例操作,实现一定的功能
*/
public void otherOperation(){
//实现一定的功能,可能会使用具体实现部分的实现方法,
//但是本方法更大的可能是使用Abstraction中定义的方法,
//通过组合使用Abstraction中定义的方法来完成更多的功能
}
}
使用上述架构实现发送提示消息的实例如下:
//消息发送业务接口
public interface MessageImplementor {
public void send(String message,String toUser);
}
public abstract class AbstractMessage {
protected MessageImplementor impl;
public AbstractMessage(MessageImplementor impl){
this.impl = impl;
}
public void sendMessage(String message,String toUser){
this.impl.send(message, toUser);
}
}
public class MessageSMS implements MessageImplementor{
public void send(String message, String toUser) {
System.out.println("使用站内短消息的方式,发送消息'"
+message+"'给"+toUser);
}
public class MessageEmail implements MessageImplementor{
public void send(String message, String toUser) {
System.out.println("使用Email的方式,发送消息'"
+message+"'给"+toUser);
}
}
public class CommonMessage extends AbstractMessage{
public CommonMessage(MessageImplementor impl) {
super(impl);
}
public void sendMessage(String message, String toUser) {
super.sendMessage(message, toUser);
}
}
public class UrgencyMessage extends AbstractMessage{
public UrgencyMessage(MessageImplementor impl) {
super(impl);
}
public void sendMessage(String message, String toUser) {
message = "加急:"+message;
super.sendMessage(message, toUser);
}
public Object watch(String messageId) {
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) {
message = "特急:"+message;
super.sendMessage(message, toUser);
//还需要增加一条待催促的信息
}
}
如果要增加一种发送方式:比如手机发送,只需要增加一种实现就OK了
public class MessageMobile implements MessageImplementor{
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 m = new CommonMessage(impl);
m.sendMessage("请喝一杯茶", "小李");
//创建一个紧急消息对象
m = new UrgencyMessage(impl);
m.sendMessage("请喝一杯茶", "小李");
//创建一个特急消息对象
m = new SpecialUrgencyMessage(impl);
m.sendMessage("请喝一杯茶", "小李");
//把实现方式切换成手机短消息,然后再实现一遍
impl = new MessageMobile();
m = new CommonMessage(impl);
m.sendMessage("请喝一杯茶", "小李");
m = new UrgencyMessage(impl);
m.sendMessage("请喝一杯茶", "小李");
m = new SpecialUrgencyMessage(impl);
m.sendMessage("请喝一杯茶", "小李");
}
}
桥接模式和策略模式的区别:
桥接模式的抽象部分,是可以继续扩展和变化的,而策略模式只有上下文,是不存在所谓抽象部分的。
分享到:
相关推荐
VMware 15虚拟机桥接模式无法上网问题 步骤 1:在设置中找到 网络和internet—>>更改适配器选项—–>>以太网 查看 共享网络给虚拟机(有些电脑不用) 步骤2:查看VMware虚拟网络编辑器的VMnet0桥接模式设置 ...
所有模式都可分为类模式和对象模式两种,类模式是继承,对象模式是委托,而桥接模式和策略模式都是将任务委托给另外一个接口去实现,那么两者的区别什么呢?
Bridge 桥接模式(结构型模式)视频
图片浏览器的接口设计-桥接模式的运用 解决问题: 一个图像格式有两个基本的方面,一是结构,二是表象。其结构决定了图像是怎样存储的,而其表象决定了图像是怎样显示在屏幕上的。对于一个图像格式(BMP、JPG等)来...
利用桥接模式完成以下实例: 1、编辑与作者。出版社的编辑负责策划图书,并遴选作者完成图书的编著,然后根据图书的印张发布图书。作者负责完成图书的编著工作。 2、模拟毛笔:现需要提供大中小3种型号的画笔,...
桥接模式 桥接模式
桥接模式 C++ 实现
VMWare 6.0桥接模式虚拟机网络配置
设计模式 java 桥接模式
桥接模式的例子源码。这个源码因完成仓促,仅用来解释说明桥接模式含义,代码规范稍有欠缺,仅供参考。
C#面向对象设计模式纵横谈(8):Bridge 桥接模式(结构型模式) 体验课程
桥接模式和装饰模式,设计模式实验报告,BlueJ
设计模式专题之(十)桥接模式---设计模式桥接模式示例代码(python--c++)
设计模式-桥接模式(讲解及其实现代码)
设计模式 - 桥接模式
设计模式的桥接模式的例子,希望对大家有用
桥接模式通过将抽象部分和代码部分相分离,使之沿各自的维度变化而不互相影响,使用的时候通过对象参数进行连接,参数可进行变化
桥接模式的示例代码和文档,学习桥接模式的参考资料。
Android桥接模式demo,同步文章地址:http://blog.csdn.net/qq_28690547/article/details/51144783
海尔(Haier)、TCL、海信(Hisense)桥接模式