`
HQFish
  • 浏览: 9454 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

桥接模式(Bridge Pattern)的应用一

阅读更多
消息发送组件
    设计一个发送消息的组件,可以发送普通消息、加急消息和特急消息,不同的消息类型处理逻辑不同,加急消息需要在消息上添加“加急”字样,特急消息除了添车“特急”字样外还会定时催促,至到完成(需要记录该消息是否已被完成的状态)。消息发送可以支持多种方式如:站内信、邮件、手机短信等。
    
思考过程
    作为消息发送组件,我们希望它能提供友好的API调用,并且对调用者屏蔽具体的实现,实际上调用者也不关心其具体实现。
    1、希望组件提供的API:
        消息组件.发送(消息,级别,发送方式)  MessageComponent.sendMessage(Message msg,MessageLevel.level1, SendType.All);
        MessageLeve作为静态常量类定义了各种消息级别:普通消息,加急消息,特急消息等;SendType作为静态常量类定义了消息发送的方式:站内信、邮件、短信等;
        这样设计API的好处是调用简单,无需关心具体实现,方便以后扩展:扩展消息类型和发送方式对调用端都不会产生影响。
    2、OO设计原则之一是:对修改关闭对扩展开放,消息组件中可能扩展的地方:消息的类型:如增加严重级别的消息,如果该消息通知的内容不被处理,用户不能进行任何其它操作;发送方式:通过WebService通知“核心系统”某消息。任何一种类型的消息可以通过任何一种方式发送-->说明消息与发送方式可以任意组合。以上两点完全符合桥接模式:将抽象部分与它的实现部分分离,使它们都可以独立地变化。
   类图:


Message中一个消息发送器的集合,消息与消息发送器是一对多的关系:一条消息可以被多种消息发送器发送。
    示意代码:
/**
 * 所有消息的抽象父类
 * @author yuhq
 *
 */
public abstract class Message {
 //消息发送器集合
 private List<MessageSender> senderList;
 
 //消息内容对象
 private MsgVO msgVO;
 
 public void setMessage(MsgVO msgVO){
  this.msgVO = msgVO;
 }
 
 /**
  * 设置消息发送器集合
  * @param senderList 消息发送器集合
  */
 public void setMsgSenderList(List<MessageSender> senderList){
  this.senderList = senderList;
 }
 
/**
  * 发布消息
  */
 public void sendMessage(){
  //遍历消息发送器,发送消息
  for (MessageSender sender : senderList) {
   //过滤消息发送器
   if(filterMsgSender(sender)) continue;
   //发送消息
   if(!sender.send(msgVO)){
    //如果消息发送失败,将消息记录到文件或是数据库中,通过定时任务来处
    //理发送失败的消息,为了不影响正常业务处理
   }
  }
 }
 
 /**
  * 子类扩展该方法可以实现根据指定条件过滤某些消息发送器,默认不过滤任务消息发送器
  * @param sender 消息发送器
  * @return true:表示过虑,false:不过滤
  */
 public boolean filterMsgSender(MessageSender sender){
  return false;
 }
}


/**
 * 消息内容对象
 * @author yuhq
 *
 */
public class MsgVO {

 //消息内容
 private String msg;
 
 //消息状态
 private String satatus;

 //消息发布者
 private String promulgator;
 
 //消息创建时间:yyyy-MM-dd hh:mm:ss
 private String dateTime;
 
 //其它属性
 
 //setter and getter方法
}


/**
 * 紧急消息,对消息进行处理
 * @author yuhq
 *
 */
public class UrgentMessage extends Message{

 @Override
 public void setMessage(MsgVO msgVO) {
  //添加消息处理
  handleMessage(msgVO);
  
  super.setMessage(msgVO);
 }
 
 /**
  * 对消息进行处理
  * @param msgVO 消息内容对象
  */
 public void handleMessage(MsgVO msgVO){
  msgVO.setMsg("特急:"+msgVO.getMsg());
 }

}

/**
 * 特急消息处理,在消息中添加特急字样,并对未处理的消息一直提醒
 * @author yuhq
 *
 */
public class ExtraUrgentMessage extends Message{
 
 //启动定时调度任务,查询消息状态,一直提醒未处理的消息
 static{
  //TODO
 }
 
 @Override
 public void setMessage(MsgVO msgVO) {
  //添加消息处理
  handleMessage(msgVO);
  
  super.setMessage(msgVO);
 }
 /**
  * 对消息进行处理
  * @param msgVO 消息内容对象
  */
 public void handleMessage(MsgVO msgVO){
  msgVO.setMsg("特急:"+msgVO.getMsg());
 }
 
 /**
  * 记录消息,并将消息状态修改为“未处理”
  */
 public void watch(){
  //TODO
 }

}


/**
 * 消息发送器的抽象对象
 * @author yuhq
 *
 */
public abstract class MessageSender {

 /**
  * 发送消息,由子类具体实现站内信、邮件、短信等方式
  * @param msgVO 消息内容对象
  * @return
  */
 public abstract boolean send(MsgVO msgVO);
}

/**
 * 邮件发送器
 * @author yuhq
 *
 */
public class EmailMessageSender extends MessageSender{

 /**
  * 发送消息,从配置文件中读取邮箱配置配置信并发送邮件
  */
 public boolean send(MsgVO msgVO) {
  //具体发送代码
  return true;
 }
 
}
  3、有了消息及消息发送器,再提供桥接模式中的Client,即是这里消息组件对外提供的调用API
/**
 * 消息发送组件
 * @author yuhq
 *
 */
public class MessageComponent {

 /**
  * 消息发送
  * @param msgVO 消息内容对象
  * @param msgLevel 消级级别
  * @param sendTypes 发送方式
  */
 public void sendMessage(MsgVO msgVO,int msgLevel, int[] sendTypes){
  Message message = null;//消息
  List<MessageSender> senderList = new ArrayList<MessageSender>();//消息发送器
  switch (msgLevel) {
  //紧急消息
  case MsgLevel.URGENT_MSG:
   message = new UrgentMessage();
   break;
  //特急消息	
  case MsgLevel.NORMAL_MSG:
   message = new ExtraUrgentMessage();
   break;
  //普通消息 
  default:
   message = new NormalMessage();
   break;
  }
  
  
  for (int i = 0; i < sendTypes.length; i++) {
   switch (sendTypes[i]) {
   //邮件发送
   case SendType.EMAIL_SEND:
    senderList.add(new EmailMessageSender());
    break;
   //短信发送	
   case SendType.NOTE_SEND:
    senderList.add(new NoteMessageSender());
    break;
   //站内信发送
   default:
    senderList.add(new InteriorMessageSender());
    break;
   }
  }
  
  //设置消息发送器
  message.setMsgSenderList(senderList);
  //发送消息
  message.sendMessage();
 }
 
 /**
  * 消息级别
  * @author yuhq
  *
  */
 class MsgLevel{
  /**
   * 普通消息
   */
  public static final int NORMAL_MSG = 0;
  
  /**
   * 紧急消息
   */
  public static final int URGENT_MSG = 1;
  
  /**
   * 特急消息
   */
  public static final int EXTRA_URGENT_MSG = 2;
 }
 
 /**
  * 消息发送方式静态常量类
  * @author yuhq
  *
  */
 class SendType{
  /**
   * 站内信发送
   */
  public static final int INTERIOR_SEND = 0;
  
  /**
   * 邮件发送
   */
  public static final int EMAIL_SEND = 1;
  
  /**
   * 短信发送
   */
  public static final int NOTE_SEND = 2;
  
  /**
   * 所有方式发送
   */
  public static final int ALL_SEND = 3;
 }
}
 4、到这里已经将消息组件的主要设计思路理清楚了,还有一些与桥接模式无关的细化工作需要完成,待续... 
  • 大小: 84.7 KB
1
0
分享到:
评论
2 楼 HQFish 2015-03-20  
030710314 写道
假如新加一种发送器,那么发送组件中的sendMessge方法就需要修改,是不是有什么方法可以不用这样呢


不需要修改,添加自己的发送器,只需要继承Message即可。 符合开闭原则:对修改关闭,对扩展开放
1 楼 030710314 2015-03-18  
假如新加一种发送器,那么发送组件中的sendMessge方法就需要修改,是不是有什么方法可以不用这样呢

相关推荐

    设计模式之桥接模式BridgePattern

    将抽象部分与它的实现部分分离,使它们都可以独立地变化。

    设计模式面面观(10):桥接模式(Bridge Pattern)-结构型模式

    创建型模式 (100%) 设计模式面面观(8):创建型模式总结 (100%) 设计模式面面观(9):适配器模式(Adapter Pattern)-结构型模式 (100%) 设计模式面面观(10):桥接模式(Bridge Pattern)-结构型模式 ...

    桥接模式(Bridge Pattern)原理图

    桥接模式是一种结构型设计模式,它的目的是将抽象化与实现化解耦,使得它们可以独立变化。这种模式主要用于处理当一个类存在两个或多个独立的变化的维度时的情况,例如,当一个类的抽象部分和实现部分可能发生变化,...

    Bridge 桥接模式(结构型模式)

    -C#面向对象设计模式纵横谈(8):Bridge 桥接模式(结构型模式)

    .NET设计模式(9):桥接模式(BridgePattern)

    [GOF《设计模式》]图1Bridge模式结构图桥接模式将抽象部分与它的实现分离,使它们能够独立地变化。一个普通的开关控制的电灯、电风扇等等,都是桥接的例子。开关的目的是将设备打开或关闭。实际的开关可以是简单的双...

    Python设计模式之桥接模式原理与用法实例分析

    桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们都可以独立地变化. 下面是一个桥接模式的demo: #!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = 'Andy' 大话设计模式 设计模式——...

    Java设计模式之桥接模式

    桥接模式(Bridge Pattern),将抽象部分与它的实现部分分离,使它们都可以独立地变化。更容易理解的表述是:实现系统可从多种维度分类,桥接模式将各维度抽象出来,各维度独立变化,之后可通过聚合,将各维度组合...

    C#版 24种设计模式

    观察者模式(Observer Pattern) 建造者模式(Builder Pattern) 解释器模式(Interpreter Pattern) 命令模式(Command Pattern) 模板方法模式(Template Method Pattern) 桥接模式(Bridge Pattern) 适配器模式(Adapter ...

    用Java实现23种设计模式

    桥接模式(Bridge Pattern) 过滤器模式(Filter、Criteria Pattern) 组合模式(Composite Pattern) 装饰器模式(Decorator Pattern) 外观模式(Facade Pattern) 享元模式(Flyweight Pattern) 代理模式...

    C#设计模式_设计模式_C#_

    桥接模式(Bridge Pattern) 8. 装饰模式(Decorator Pattern) 9. 组合模式(Composite Pattern) 10. 外观模式(Facade Pattern) 11. 享元模式(Flyweight Pattern) 12. 代理模式(Proxy Pattern) 行为型: 13. 模板方法...

    Java设计模式,并加上个人理解

    1. 设计模式 1.1 含义 1.2 作用 1.3 设计原则 1.4 分类 2. 简单工厂模式 (SimpleFactoryPattern) 3. 工厂方法模式 (Factory Method) ...16. 桥接模式 (Bridge Pattern) 17. 观察者模式 (Observer Pattern)

    C#设计模式(23种设计模式)

    桥接模式(Bridge Pattern) 8. 装饰模式(Decorator Pattern) 9. 组合模式(Composite Pattern) 10. 外观模式(Facade Pattern) 11. 享元模式(Flyweight Pattern) 12. 代理模式(Proxy Pattern) 13. 模板...

    Bridge Pattern

    桥接模式,参考自 http://www.cnblogs.com/houleixx/archive/2008/02/23/1078877.html

    设计模式PPT

     桥接模式(Bridge Pattern)  组合模式(Composite Pattern)  装饰者模式(Decorator Pattern)  外观模式(Facade Pattern)  享元模式(Flyweight Pattern)  代理模式(Proxy Pattern) 行为型模式...

    设计模式代码——c#

    7. 桥接模式(Bridge Pattern) 8. 装饰模式(Decorator Pattern) 9. 组合模式(Composite Pattern) 10. 外观模式(Facade Pattern) 11. 享元模式(Flyweight Pattern) 12. 代理模式(Proxy Pattern) 行为型 ...

    23种设计模式 (创建型,结构型,行为型)

    桥接模式(Bridge Pattern) 8. 装饰模式(Decorator Pattern) 9. 组合模式(Composite Pattern) 10. 外观模式(Facade Pattern) 11. 享元模式(Flyweight Pattern) 12. 代理模式(Proxy Pattern) 13. 模板...

    33种JAVA设计模式DEMO

    桥接模式(Bridge Pattern) 过滤器模式(Filter、Criteria Pattern) 组合模式(Composite Pattern) 装饰器模式(Decorator Pattern) 外观模式(Facade Pattern) 享元模式(Flyweight Pattern) 代理模式(Proxy...

    C++设计模式(Design Pattern)范例源代码

    桥接模式(Bridge) 组合模式(Composite) 装饰者模式(Decorator) 外观模式(Facade) 蝇量模式(Flyweight) 代理模式(Proxy) 行为型: 责任链模式(Chain of Responsibility) 命令模式(Command) 解释器模式(Interpreter) ...

Global site tag (gtag.js) - Google Analytics