`
HQFish
  • 浏览: 9709 次
  • 性别: 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

    桥接模式(Bridge Pattern)是设计模式中的一种结构型模式,它主要解决的是在软件设计中,当抽象和实现之间存在紧密耦合时,如何使这两者能够独立地变化。这种模式通过引入一个抽象层来分离接口和实现,使得它们可以...

    c++-设计模式之桥接模式(Bridge Pattern)

    桥接模式(Bridge Pattern)是一种结构型设计模式,它将抽象部分与实现部分分离,使得两者可以独立地变化。这种模式常用于需要在多个维度上变化的场景,比如不同的形状和颜色,允许在不改变客户端代码的情况下增加新...

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

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

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

    桥接模式(Bridge Pattern)是一种结构型设计模式,它的主要目的是将抽象部分与实现部分分离,使得它们可以独立地进行变化。在软件工程中,这种分离有助于降低复杂性,提高代码的可维护性和可扩展性。桥接模式的核心...

    桥接模式(Bridge Pattern)原理图

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

    桥接模式和策略模式的区别,内含可运行代码和两者详细区别

    首先,桥接模式(Bridge Pattern)的核心思想是“分离抽象与实现”。它通过建立一个抽象层和一个实现层的独立继承体系,使得抽象部分和实现部分可以独立变化,形成一种解耦的设计。在桥接模式中,抽象类引用实现类的...

    设计模型之桥接模式 bridge C++实现源码,vs2019

    桥接模式(Bridge Pattern)是一种结构型设计模式,它的主要目的是将抽象部分与其实现部分解耦,使得它们可以独立地进行变化和发展。在C++编程中,这种模式的应用可以帮助我们构建灵活、可扩展的系统,尤其在面对...

    设计模式---桥接模式

    桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立进行变化。这种模式在软件工程中被广泛应用于处理组件之间的耦合问题,特别是当需要为同一抽象提供多种实现或者需要独立地改变它们时。 ...

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

    桥接模式(Bridge Pattern)是面向对象设计中的一种结构型模式,它将抽象部分与实现部分分离,使得它们可以独立地进行变化。在C#编程中,桥接模式的应用能够帮助我们更好地解耦系统,提高代码的灵活性和可扩展性。 ...

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

    桥接模式(Bridge Pattern)是一种结构型设计模式,它旨在将抽象部分与其实现部分分离,使得它们可以独立地进行变化。在C#编程中,这种模式尤其有用,因为随着软件系统的复杂性增加,类的继承层次可能会变得难以管理...

    设计模式之桥接模式

    桥接模式(Bridge Pattern)是设计模式中结构型模式的一种,它的主要目的是将抽象部分与实现部分解耦,使得它们可以独立地进行变化。在Java编程中,这种模式的应用可以帮助我们构建更加灵活、可扩展的代码结构。 ...

    适配器、桥接模式实例代码

    适配器模式(Adapter Pattern)和桥接模式(Bridge Pattern)是两种非常重要的设计模式,它们各自在特定场景下发挥着重要作用。 适配器模式的核心思想是将两个不兼容的接口进行适配,使得原本无法一起工作的类能够...

    BridgePattern 桥接设计模式示例

    桥接设计模式是一种结构型设计模式,它将抽象部分与其实现部分相分离,使得它们可以独立进行变化。在实际的软件开发中,这种模式能够帮助我们构建灵活、可扩展的系统,允许我们在不修改原有代码的情况下增加新的功能...

    桥接模式demo

    桥接模式(Bridge Pattern)是一种结构型设计模式,它的主要目的是将抽象部分与实现部分分离,使得它们可以独立地进行变化。在这个“桥接模式demo”中,我们可能看到一个具体的示例,如何通过该模式将接口或抽象类的...

    桥接模式源码

    通过桥接模式,我们可以看到在`BridgePattern.zip`中的源代码如何演示了这一模式。具体实现可能包括不同的类和方法,展示如何在运行时动态组合抽象和实现,以达到灵活多变的效果。理解这个模式的实现可以帮助我们更...

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

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

    java常用设计模式-桥接模式

    桥接模式(Bridge Pattern)是一种常用的设计模式,它将抽象化和实现化解耦,使用封装、聚合以及继承等基本技术,将两个独立变化的维度通过抽象化的方式进行桥接,从而降低了它们之间的耦合度,使得系统更加灵活。...

    Bridge Pattern

    桥接模式(Bridge Pattern)是一种结构型设计模式,它的主要目的是将抽象部分与实现部分分离,使得它们可以独立地进行变化。在桥接模式中,抽象类不直接依赖于实现类,而是通过一个抽象的“桥”接口来引用实现类,...

Global site tag (gtag.js) - Google Analytics