中介者模式(Mediator Pattern)

介绍
用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

示例
有一个Message实体类,某个对象对它的操作有Send()和Insert()方法,现在用一个中介对象来封装这一系列的对象交互。

  MessageModel

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4.  
  5. namespace Pattern.Mediator
  6. {
  7. /// <summary>
  8. /// Message实体类
  9. /// </summary>
  10. public class MessageModel
  11. {
  12. /// <summary>
  13. /// 构造函数
  14. /// </summary>
  15. /// <param name="msg">Message内容</param>
  16. /// <param name="pt">Message发布时间</param>
  17. public MessageModel(string msg, DateTime pt)
  18. {
  19. this._message = msg;
  20. this._publishTime = pt;
  21. }
  22.  
  23. private string _message;
  24. /// <summary>
  25. /// Message内容
  26. /// </summary>
  27. public string Message
  28. {
  29. get { return _message; }
  30. set { _message = value; }
  31. }
  32.  
  33. private DateTime _publishTime;
  34. /// <summary>
  35. /// Message发布时间
  36. /// </summary>
  37. public DateTime PublishTime
  38. {
  39. get { return _publishTime; }
  40. set { _publishTime = value; }
  41. }
  42. }
  43. }

  AbstractMessageMediator

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4.  
  5. namespace Pattern.Mediator
  6. {
  7. /// <summary>
  8. /// 抽象中介者(Mediator)
  9. /// </summary>
  10. public abstract class AbstractMessageMediator
  11. {
  12. /// <summary>
  13. /// 注册一个操作Message的对象
  14. /// </summary>
  15. /// <param name="AbstractMessage">AbstractMessage</param>
  16. public abstract void Register(AbstractMessage AbstractMessage);
  17.  
  18. /// <summary>
  19. /// 发送Message
  20. /// </summary>
  21. /// <param name="from">来自UserId</param>
  22. /// <param name="to">发送到UserId</param>
  23. /// <param name="mm">Message实体对象</param>
  24. /// <returns></returns>
  25. public abstract string Send(string from, string to, MessageModel mm);
  26. }
  27. }

  MessageMediator

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4.  
  5. namespace Pattern.Mediator
  6. {
  7. /// <summary>
  8. /// 中介者(ConcreteMediator)
  9. /// </summary>
  10. public class MessageMediator : AbstractMessageMediator
  11. {
  12. private Dictionary<string, AbstractMessage> _dictionary = new Dictionary<string, AbstractMessage>();
  13.  
  14. /// <summary>
  15. /// 注册一个操作Message的对象
  16. /// </summary>
  17. /// <param name="abstractMessage">AbstractMessage</param>
  18. public override void Register(AbstractMessage abstractMessage)
  19. {
  20. if (!_dictionary.ContainsKey(abstractMessage.UserId))
  21. {
  22. _dictionary.Add(abstractMessage.UserId, abstractMessage);
  23. }
  24.  
  25. abstractMessage.AbstractMessageMediator = this;
  26. }
  27.  
  28. /// <summary>
  29. /// 发送Message
  30. /// </summary>
  31. /// <param name="from">来自UserId</param>
  32. /// <param name="to">发送到UserId</param>
  33. /// <param name="mm">Message实体对象</param>
  34. /// <returns></returns>
  35. public override string Send(string from, string to, MessageModel mm)
  36. {
  37. AbstractMessage abstractMessage = _dictionary[to];
  38. if (abstractMessage != null)
  39. {
  40. return abstractMessage.Insert(from, mm);
  41. }
  42. else
  43. {
  44. return null;
  45. }
  46. }
  47. }
  48. }

  AbstractMessage

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4.  
  5. namespace Pattern.Mediator
  6. {
  7. /// <summary>
  8. /// 操作Message抽象类(Colleague)
  9. /// </summary>
  10. public abstract class AbstractMessage
  11. {
  12. private AbstractMessageMediator _abstractMessageMediator;
  13. private string _userId;
  14.  
  15. /// <summary>
  16. /// 构造函数
  17. /// </summary>
  18. /// <param name="userId">UserId</param>
  19. public AbstractMessage(string userId)
  20. {
  21. this._userId = userId;
  22. }
  23.  
  24. /// <summary>
  25. /// UserId
  26. /// </summary>
  27. public string UserId
  28. {
  29. get { return _userId; }
  30. }
  31.  
  32. /// <summary>
  33. /// 中介者
  34. /// </summary>
  35. public AbstractMessageMediator AbstractMessageMediator
  36. {
  37. get { return _abstractMessageMediator; }
  38. set { _abstractMessageMediator = value; }
  39. }
  40.  
  41. /// <summary>
  42. /// 发送Message(由客户端调用)
  43. /// </summary>
  44. /// <param name="to">发送到UserId</param>
  45. /// <param name="mm">Message实体对象</param>
  46. /// <returns></returns>
  47. public string Send(string to, MessageModel mm)
  48. {
  49. return _abstractMessageMediator.Send(_userId, to, mm);
  50. }
  51.  
  52. /// <summary>
  53. /// 接受Message(由中介者调用)
  54. /// </summary>
  55. /// <param name="from">来自UserId</param>
  56. /// <param name="mm">Message实体对象</param>
  57. /// <returns></returns>
  58. public abstract string Insert(string from, MessageModel mm);
  59. }
  60. }

  SqlMessage

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4.  
  5. namespace Pattern.Mediator
  6. {
  7. /// <summary>
  8. /// Sql方式操作Message(ConcreteColleague)
  9. /// </summary>
  10. public class SqlMessage : AbstractMessage
  11. {
  12. /// <summary>
  13. /// 构造函数
  14. /// </summary>
  15. /// <param name="userId">UserId</param>
  16. public SqlMessage(string userId)
  17. : base(userId)
  18. {
  19.  
  20. }
  21.  
  22. /// <summary>
  23. /// 接受Message(由中介者调用)
  24. /// </summary>
  25. /// <param name="from">来自UserId</param>
  26. /// <param name="mm">Message实体对象</param>
  27. /// <returns></returns>
  28. public override string Insert(string from, MessageModel mm)
  29. {
  30. return "Sql方式插入Message(" + from + "发送给" + base.UserId + ")"
  31. + " - 内容:" + mm.Message
  32. + " - 时间:" + mm.PublishTime.ToString();
  33. }
  34. }
  35. }

  XmlMessage

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4.  
  5. namespace Pattern.Mediator
  6. {
  7. /// <summary>
  8. /// Xml方式操作Message(ConcreteColleague)
  9. /// </summary>
  10. public class XmlMessage : AbstractMessage
  11. {
  12. /// <summary>
  13. /// 构造函数
  14. /// </summary>
  15. /// <param name="userId">UserId</param>
  16. public XmlMessage(string userId)
  17. : base(userId)
  18. {
  19.  
  20. }
  21.  
  22. /// <summary>
  23. /// 接受Message(由中介者调用)
  24. /// </summary>
  25. /// <param name="from">来自UserId</param>
  26. /// <param name="mm">Message实体对象</param>
  27. /// <returns></returns>
  28. public override string Insert(string from, MessageModel mm)
  29. {
  30. return "Xml方式插入Message(" + from + "发送给" + base.UserId + ")"
  31. + " - 内容:" + mm.Message
  32. + " - 时间:" + mm.PublishTime.ToString();
  33. }
  34. }
  35. }

  Test

  1. using System;
  2. using System.Data;
  3. using System.Configuration;
  4. using System.Collections;
  5. using System.Web;
  6. using System.Web.Security;
  7. using System.Web.UI;
  8. using System.Web.UI.WebControls;
  9. using System.Web.UI.WebControls.WebParts;
  10. using System.Web.UI.HtmlControls;
  11.  
  12. using Pattern.Mediator;
  13.  
  14. public partial class Mediator : System.Web.UI.Page
  15. {
  16. protected void Page_Load(object sender, EventArgs e)
  17. {
  18. AbstractMessageMediator messageMediator = new MessageMediator();
  19.  
  20. AbstractMessage user1 = new SqlMessage("user1");
  21. AbstractMessage user2 = new SqlMessage("user2");
  22. AbstractMessage user3 = new XmlMessage("user3");
  23. AbstractMessage user4 = new XmlMessage("user4");
  24.  
  25. messageMediator.Register(user1);
  26. messageMediator.Register(user2);
  27. messageMediator.Register(user3);
  28. messageMediator.Register(user4);
  29.  
  30. Response.Write(user1.Send("user2", new MessageModel("你好!", DateTime.Now)));
  31. Response.Write("<br />");
  32. Response.Write(user2.Send("user1", new MessageModel("我不好!", DateTime.Now)));
  33. Response.Write("<br />");
  34. Response.Write(user1.Send("user2", new MessageModel("不好就不好吧。", DateTime.Now)));
  35. Response.Write("<br />");
  36. Response.Write(user3.Send("user4", new MessageModel("吃了吗?", DateTime.Now)));
  37. Response.Write("<br />");
  38. Response.Write(user4.Send("user3", new MessageModel("没吃,你请我?", DateTime.Now)));
  39. Response.Write("<br />");
  40. Response.Write(user3.Send("user4", new MessageModel("不请。", DateTime.Now)));
  41. Response.Write("<br />");
  42. }
  43. }

  运行结果
  Sql方式插入Message(user1发送给user2) - 内容:你好! - 时间:2007-5-19 23:43:19
  Sql方式插入Message(user2发送给user1) - 内容:我不好! - 时间:2007-5-19 23:43:19
  Sql方式插入Message(user1发送给user2) - 内容:不好就不好吧。 - 时间:2007-5-19 23:43:19
  Xml方式插入Message(user3发送给user4) - 内容:吃了吗? - 时间:2007-5-19 23:43:19
  Xml方式插入Message(user4发送给user3) - 内容:没吃,你请我? - 时间:2007-5-19 23:43:19
  Xml方式插入Message(user3发送给user4) - 内容:不请。 - 时间:2007-5-19 23:43:19

二十四种设计模式:中介者模式(Mediator Pattern)的更多相关文章

  1. 二十四种设计模式:命令模式(Command Pattern)

    命令模式(Command Pattern) 介绍将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可取消的操作. 示例有一个Message实体类,某个 ...

  2. 二十四种设计模式:解释器模式(Interpreter Pattern)

    解释器模式(Interpreter Pattern) 介绍给定一个语言, 定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子. 示例有一个Message实体类,某个类对它的 ...

  3. 二十四种设计模式:迭代器模式(Iterator Pattern)

    迭代器模式(Iterator Pattern) 介绍提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示. 示例有一个Message实体类,某聚合对象内的各个元素均为该实体对象,现 ...

  4. 二十四种设计模式:策略模式(Strategy Pattern)

    策略模式(Strategy Pattern) 介绍定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法的变化可独立于使用它的客户. 示例有一个Message实体类,对它的操作有 ...

  5. 二十四种设计模式:组合模式(Composite Pattern)

    组合模式(Composite Pattern) 介绍将对象组合成树形结构以表示"部分-整体"的层次结构.它使得客户对单个对象和复合对象的使用具有一致性.示例有一个Message实体 ...

  6. 二十四种设计模式:状态模式(State Pattern)

    状态模式(State Pattern) 介绍允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它所属的类. 示例有一个Message实体类,对它的操作有Insert()和Get()方法, ...

  7. 二十四种设计模式:原型模式(Prototype Pattern)

    原型模式(Prototype Pattern) 介绍用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象.示例有一个Message实体类,现在要克隆它. MessageModel usin ...

  8. 二十四种设计模式:外观模式(Facade Pattern)

    外观模式(Facade Pattern) 介绍为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用.示例有一个Message实体类,某对象对它 ...

  9. 二十四种设计模式:提供者模式(Provider Pattern)

    提供者模式(Provider Pattern) 介绍为一个API进行定义和实现的分离.示例有一个Message实体类,对它的操作有Insert()和Get()方法,持久化数据在SqlServer数据库 ...

  10. 二十四种设计模式:桥接模式(Bridge Pattern)

    桥接模式(Bridge Pattern) 介绍将抽象部分与它的实现部分分离,使它们都可以独立地变化. 示例有一个Message实体类,对它的操作有Insert()和Get()方法,现在使这些操作的抽象 ...

随机推荐

  1. BZOJ 3181 BROJ

    像我这种SB还是早点退役. #include<iostream> #include<cstdio> #include<cstring> #include<al ...

  2. BZOJ 3163 Eden的新背包问题

    分治背包+单调队列优化. 但是为什么maxn要1w多?...不怎么懂. #include<iostream> #include<cstdio> #include<cstr ...

  3. Android 线程模型

    Android 线程模型 1. import android.os.Handler;  import android.os.Message; public class MainActivity ext ...

  4. IOS 使用block完成网络请求的自定义类BlockURLConnection

    一,头文件 #import <Foundation/Foundation.h>//定义下载中block类型typedef void(^ProcessBlock) (NSURLRespons ...

  5. 拆解一个简单的KeyFile保护

    系统 : Windows xp 程序 : abexcrackme3 程序下载地址 :http://pan.baidu.com/s/1mh3TiqO 要求 : 伪造Keyfile 使用工具 :IDA 可 ...

  6. 数据库 SQL优化

    1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  7. X86平台乱序执行简要分析(翻译为主)

    多处理器使用松散的内存模型可能会非常混乱,写操作可能会无序,读操作可能会返回不是我们想要的值,为了解决这些问题,我们需要使用内存栅栏(memory fences),或者说内存屏障(memory bar ...

  8. Node.js简单介绍并实现一个简单的Web MVC框架

    编号:1018时间:2016年6月13日16:06:41功能:Node.js简单介绍并实现一个简单的Web MVC框架URL :https://cnodejs.org/topic/4f16442cca ...

  9. Java单例类的简单实现

    对于java新手来说,单例类给我的印象挺深,之前一道web后台笔试题就是写单例类.*.*可惜当时不了解. 在大部分时候,我们将类的构造器定义成public访问权限,允许任何类自由创建该类的对象.但在某 ...

  10. Queue及Stack

    Queue 她是一个接口,有多冢实现方式(LinkedList.ArrayDeque等) 类别 方法 入队 add.offer(优先级高) 出队 remove.poll 查询 element.peek ...