二十四种设计模式:中介者模式(Mediator Pattern)
中介者模式(Mediator Pattern)
介绍
用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
示例
有一个Message实体类,某个对象对它的操作有Send()和Insert()方法,现在用一个中介对象来封装这一系列的对象交互。
MessageModel
using System;
using System.Collections.Generic;
using System.Text; namespace Pattern.Mediator
{
/// <summary>
/// Message实体类
/// </summary>
public class MessageModel
{
/// <summary>
/// 构造函数
/// </summary>
/// <param name="msg">Message内容</param>
/// <param name="pt">Message发布时间</param>
public MessageModel(string msg, DateTime pt)
{
this._message = msg;
this._publishTime = pt;
} private string _message;
/// <summary>
/// Message内容
/// </summary>
public string Message
{
get { return _message; }
set { _message = value; }
} private DateTime _publishTime;
/// <summary>
/// Message发布时间
/// </summary>
public DateTime PublishTime
{
get { return _publishTime; }
set { _publishTime = value; }
}
}
}
AbstractMessageMediator
using System;
using System.Collections.Generic;
using System.Text; namespace Pattern.Mediator
{
/// <summary>
/// 抽象中介者(Mediator)
/// </summary>
public abstract class AbstractMessageMediator
{
/// <summary>
/// 注册一个操作Message的对象
/// </summary>
/// <param name="AbstractMessage">AbstractMessage</param>
public abstract void Register(AbstractMessage AbstractMessage); /// <summary>
/// 发送Message
/// </summary>
/// <param name="from">来自UserId</param>
/// <param name="to">发送到UserId</param>
/// <param name="mm">Message实体对象</param>
/// <returns></returns>
public abstract string Send(string from, string to, MessageModel mm);
}
}
MessageMediator
using System;
using System.Collections.Generic;
using System.Text; namespace Pattern.Mediator
{
/// <summary>
/// 中介者(ConcreteMediator)
/// </summary>
public class MessageMediator : AbstractMessageMediator
{
private Dictionary<string, AbstractMessage> _dictionary = new Dictionary<string, AbstractMessage>(); /// <summary>
/// 注册一个操作Message的对象
/// </summary>
/// <param name="abstractMessage">AbstractMessage</param>
public override void Register(AbstractMessage abstractMessage)
{
if (!_dictionary.ContainsKey(abstractMessage.UserId))
{
_dictionary.Add(abstractMessage.UserId, abstractMessage);
} abstractMessage.AbstractMessageMediator = this;
} /// <summary>
/// 发送Message
/// </summary>
/// <param name="from">来自UserId</param>
/// <param name="to">发送到UserId</param>
/// <param name="mm">Message实体对象</param>
/// <returns></returns>
public override string Send(string from, string to, MessageModel mm)
{
AbstractMessage abstractMessage = _dictionary[to];
if (abstractMessage != null)
{
return abstractMessage.Insert(from, mm);
}
else
{
return null;
}
}
}
}
AbstractMessage
using System;
using System.Collections.Generic;
using System.Text; namespace Pattern.Mediator
{
/// <summary>
/// 操作Message抽象类(Colleague)
/// </summary>
public abstract class AbstractMessage
{
private AbstractMessageMediator _abstractMessageMediator;
private string _userId; /// <summary>
/// 构造函数
/// </summary>
/// <param name="userId">UserId</param>
public AbstractMessage(string userId)
{
this._userId = userId;
} /// <summary>
/// UserId
/// </summary>
public string UserId
{
get { return _userId; }
} /// <summary>
/// 中介者
/// </summary>
public AbstractMessageMediator AbstractMessageMediator
{
get { return _abstractMessageMediator; }
set { _abstractMessageMediator = value; }
} /// <summary>
/// 发送Message(由客户端调用)
/// </summary>
/// <param name="to">发送到UserId</param>
/// <param name="mm">Message实体对象</param>
/// <returns></returns>
public string Send(string to, MessageModel mm)
{
return _abstractMessageMediator.Send(_userId, to, mm);
} /// <summary>
/// 接受Message(由中介者调用)
/// </summary>
/// <param name="from">来自UserId</param>
/// <param name="mm">Message实体对象</param>
/// <returns></returns>
public abstract string Insert(string from, MessageModel mm);
}
}
SqlMessage
using System;
using System.Collections.Generic;
using System.Text; namespace Pattern.Mediator
{
/// <summary>
/// Sql方式操作Message(ConcreteColleague)
/// </summary>
public class SqlMessage : AbstractMessage
{
/// <summary>
/// 构造函数
/// </summary>
/// <param name="userId">UserId</param>
public SqlMessage(string userId)
: base(userId)
{ } /// <summary>
/// 接受Message(由中介者调用)
/// </summary>
/// <param name="from">来自UserId</param>
/// <param name="mm">Message实体对象</param>
/// <returns></returns>
public override string Insert(string from, MessageModel mm)
{
return "Sql方式插入Message(" + from + "发送给" + base.UserId + ")"
+ " - 内容:" + mm.Message
+ " - 时间:" + mm.PublishTime.ToString();
}
}
}
XmlMessage
using System;
using System.Collections.Generic;
using System.Text; namespace Pattern.Mediator
{
/// <summary>
/// Xml方式操作Message(ConcreteColleague)
/// </summary>
public class XmlMessage : AbstractMessage
{
/// <summary>
/// 构造函数
/// </summary>
/// <param name="userId">UserId</param>
public XmlMessage(string userId)
: base(userId)
{ } /// <summary>
/// 接受Message(由中介者调用)
/// </summary>
/// <param name="from">来自UserId</param>
/// <param name="mm">Message实体对象</param>
/// <returns></returns>
public override string Insert(string from, MessageModel mm)
{
return "Xml方式插入Message(" + from + "发送给" + base.UserId + ")"
+ " - 内容:" + mm.Message
+ " - 时间:" + mm.PublishTime.ToString();
}
}
}
Test
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls; using Pattern.Mediator; public partial class Mediator : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
AbstractMessageMediator messageMediator = new MessageMediator(); AbstractMessage user1 = new SqlMessage("user1");
AbstractMessage user2 = new SqlMessage("user2");
AbstractMessage user3 = new XmlMessage("user3");
AbstractMessage user4 = new XmlMessage("user4"); messageMediator.Register(user1);
messageMediator.Register(user2);
messageMediator.Register(user3);
messageMediator.Register(user4); Response.Write(user1.Send("user2", new MessageModel("你好!", DateTime.Now)));
Response.Write("<br />");
Response.Write(user2.Send("user1", new MessageModel("我不好!", DateTime.Now)));
Response.Write("<br />");
Response.Write(user1.Send("user2", new MessageModel("不好就不好吧。", DateTime.Now)));
Response.Write("<br />");
Response.Write(user3.Send("user4", new MessageModel("吃了吗?", DateTime.Now)));
Response.Write("<br />");
Response.Write(user4.Send("user3", new MessageModel("没吃,你请我?", DateTime.Now)));
Response.Write("<br />");
Response.Write(user3.Send("user4", new MessageModel("不请。", DateTime.Now)));
Response.Write("<br />");
}
}
运行结果
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)的更多相关文章
- 二十四种设计模式:命令模式(Command Pattern)
命令模式(Command Pattern) 介绍将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可取消的操作. 示例有一个Message实体类,某个 ...
- 二十四种设计模式:解释器模式(Interpreter Pattern)
解释器模式(Interpreter Pattern) 介绍给定一个语言, 定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子. 示例有一个Message实体类,某个类对它的 ...
- 二十四种设计模式:迭代器模式(Iterator Pattern)
迭代器模式(Iterator Pattern) 介绍提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示. 示例有一个Message实体类,某聚合对象内的各个元素均为该实体对象,现 ...
- 二十四种设计模式:策略模式(Strategy Pattern)
策略模式(Strategy Pattern) 介绍定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法的变化可独立于使用它的客户. 示例有一个Message实体类,对它的操作有 ...
- 二十四种设计模式:组合模式(Composite Pattern)
组合模式(Composite Pattern) 介绍将对象组合成树形结构以表示"部分-整体"的层次结构.它使得客户对单个对象和复合对象的使用具有一致性.示例有一个Message实体 ...
- 二十四种设计模式:状态模式(State Pattern)
状态模式(State Pattern) 介绍允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它所属的类. 示例有一个Message实体类,对它的操作有Insert()和Get()方法, ...
- 二十四种设计模式:原型模式(Prototype Pattern)
原型模式(Prototype Pattern) 介绍用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象.示例有一个Message实体类,现在要克隆它. MessageModel usin ...
- 二十四种设计模式:外观模式(Facade Pattern)
外观模式(Facade Pattern) 介绍为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用.示例有一个Message实体类,某对象对它 ...
- 二十四种设计模式:提供者模式(Provider Pattern)
提供者模式(Provider Pattern) 介绍为一个API进行定义和实现的分离.示例有一个Message实体类,对它的操作有Insert()和Get()方法,持久化数据在SqlServer数据库 ...
- 二十四种设计模式:桥接模式(Bridge Pattern)
桥接模式(Bridge Pattern) 介绍将抽象部分与它的实现部分分离,使它们都可以独立地变化. 示例有一个Message实体类,对它的操作有Insert()和Get()方法,现在使这些操作的抽象 ...
随机推荐
- android手机连接PC无法正常安装驱动
工作当中我们经常会遇到Android手机连接PC的时候无法正确安装驱动,或者安装失败.当然找到正确的驱动文件时首选的解决方案,如果正确的驱动文件依旧无法安装成功我们可以打开我的电脑-->属性-- ...
- 实现:编辑短信,按power键锁屏后,再点亮屏幕,进入的还是编辑短信界面,按返回键才会进入解锁界面。
描述:在编辑短信界面按电源键锁屏后,重新按电源键点亮屏幕,并没有进入到锁屏界面而是在编辑短信界面,此时短信界面悬浮与锁屏界面之上,这时按返回键关闭编辑短信界面,回到锁屏界面,是如何实现的呢,只需要在需 ...
- Python变量与常量
变量是计算机内存中的一块区域,变量可以存储规定范围内的值,而且值可以改变.基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中.常量是一块只读的内存区域,常量一旦被初始化就不能被 ...
- Mac OS环境变量配置(Android Studio之Gradle)
以gradle环境变量配置为例: Android Studio 自带的gradle路径为: /Applications/Android\ Studio.app/Contents/gradle/grad ...
- HDU5763 another meaning -(KMP+DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5763 思路:dp[i]表示前i个字符组成的字符串所表示的意思数量,则当匹配时dp[i]=dp[i-1] ...
- 利用NTP搭建自己的ntp服务
利用NTP搭建自己的ntp服务 发表于 2013 年 9 月 22 日 作者 admin 对于校园网/企业用户,如果您网内所有计算机都通过互联网同步时间,在速度和精度上都有一定的折扣,并且对互联网出口 ...
- Java 集合深入理解(5):AbstractCollection
点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 今天好累,来学学 AbstractCollection 吧! 什么是 AbstractCollection Abstrac ...
- Unity3D ShaderLab 模拟精灵动画
Unity3D ShaderLab 模拟精灵动画 在上一篇,介绍了通过Shader 模拟纹理运动,那么更深一步讲,我们也可以把帧动画的精灵纹理运动通过shader实现. 虽然大家都是在游戏脚本中做更高 ...
- magneto创建运费模板
Magento系统自带了大概7种运费方式:平价.运费表.免运费.ups.usps.fedex.dhl等.不过这些依然无法满足我们的需求,这时候就需要创建一个shipping module 来实现了.创 ...
- magento如何获取某一产品的订单量代码
<?php $sku = nl2br($_product->getSku()); $_productCollection = Mage::getResourceModel('reports ...