原文:乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)

[索引页][源码下载]

乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)

作者:webabcd





介绍

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





示例

有一个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





参考

http://www.dofactory.com/Patterns/PatternMediator.aspx





OK

[源码下载]

乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)的更多相关文章

  1. 二十四种设计模式:中介者模式(Mediator Pattern)

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

  2. [设计模式] 17 中介者模式 Mediator Pattern

    在GOF的<设计模式:可复用面向对象软件的基础>一书中对中介者模式是这样说的:用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变 ...

  3. 设计模式系列之中介者模式(Mediator Pattern)——协调多个对象之间的交互

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  4. 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern)

    原文:乐在其中设计模式(C#) - 享元模式(Flyweight Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern) 作者:weba ...

  5. 中介者模式(Mediator Pattern)

    用于减少多个对象或类之间的通信复杂性. 此模式提供了一个中介类,它通常处理不同类之间的所有通信,并支持通过松散耦合来维护代码.中介者模式属于行为模式类别. 实现实例 在这里通过一个聊天室的示例来演示中 ...

  6. 4.7 《硬啃设计模式》 第24章 麻烦的多角关系 - 中介者模式(Mediator Pattern)简介

    在Windows程序中,有时候界面控件之间的交互会很麻烦,如:A控件显示什么的时候,B控件要显示什么,另外C控件要不可用,同样其它控件也会有类似的复杂要求.控件与控件之间很容易形成复杂的多角关系了.现 ...

  7. 23种设计模式--中介者模式-Mediator Pattern

    一.中介者模式的介绍     中介者模式第一下想到的就是中介,房子中介,婚姻中介啊等等,当然笔者也希望来个婚姻中介给我介绍一个哈哈哈,,回归正题中介者模式分成中介者类和用户类,根据接口编程的方式我们再 ...

  8. 设计模式之中介者模式(Mediator)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程.它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  9. 18.中介者模式(Mediator Pattern)

    using System; namespace Test { class Program { /// <summary> /// 中介者模式,定义了一个中介对象来封装一系列对象之间的交互关 ...

随机推荐

  1. CheckBox和RadioButton以及RadioGroup

    CheckBox:复选框 有两种状态 选中状态(true),未选状态(false) 属性 android:checked= "false"(表示该复选框未被选中) RadioGro ...

  2. poj 2201 构造

    这个题目的构造方法应该还算是很好想的,先给a按照从小到大排序,然后按顺序插入数据,构造一棵二叉查找树,而且50000的数据,nlogn的做法,应该还是很好的.不过这个题目的编码比想象中要麻烦一点,并且 ...

  3. spring配置日志

    原文:http://blog.csdn.net/xiejx618/article/details/41698913 参考:http://spring.io/blog/2009/12/04/loggin ...

  4. 2014鞍山现场赛C题HDU5072(素筛+容斥原理)

    Coprime Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total ...

  5. A Game of Thrones(7) -Arya

    Arya’s stitches were crooked again. She frowned down at them with dismay and glanced over to where h ...

  6. RabbitMq消息序列化简述

    涉及网络传输的应用.序列化不可避免. 发送端以某种规则将消息转成byte数组进行发送. 接收端则以约定的规则进行byte[]数组的解析. 序列化的选择能够是jdk序列化,hessian,jackson ...

  7. SAE开发一个应用(不仅仅是建站)

    参考http://jingyan.baidu.com/user/npublic/?un=944615045 http://sae.sina.com.cn/ 激活sae账户 登陆新浪云计算官方网站,网址 ...

  8. 从Rational Rose 到IBM Rational Software Architect和IBM Rational Rhapsody

    2014/10/27 RSA升级,重装,不知怎么搞的,不能添加某些图(比如,活动图),重试了几次都不行,在其它电脑上没有问题.后来把其它电脑上的workspace复制过来,问题攻克了,原来是works ...

  9. Linux 文件系统(二)---运行过程及结构间的关系

    (内核2.4.37) 一.首先.看看磁盘.超级块,inode节点在物理上总体的分布情况: (图示来自:www.daoluan.net) 对于一个分区,相应一个文件系统,一个文件系统事实上本质上还是磁盘 ...

  10. 字符串拼接 拆分 NameValueCollection qscoll = HttpUtility.ParseQueryString(result)

    string result = "sms&stat=100&message=发送成功"; string d = HttpUtility.ParseQueryStri ...