原文:乐在其中设计模式(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. hdu1506(dp求最大子矩阵)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1506 分析: 对于每个单位矩阵,我们先求出连续比它高的最左边的下标假设为l,然后求出比它高的最右边的下 ...

  2. 组队赛第二场:字符串哈希+DP

    长春现场赛 HDU 4821  思路:这题周赛的时候没做出来,有点可惜了.要是当时记起来unsigned long long自己主动取模,然后提醒一下大帝的话,后续大帝就能过了. 唉,导致让他取了好多 ...

  3. HDU 3217 Health(状压DP)

    Problem Description Unfortunately YY gets ill, but he does not want to go to hospital. His girlfrien ...

  4. 〖Groovy〗语言使用贴士(Tips)(转)

    [Groovy]是一门运行在[JVM]之上的动态语言.由[James Strachan]和[Bob McWhirter]于2003年启动开发,之后于2004年3月成为[JSR 241](Java Sp ...

  5. Eclipse扩展点实践之添加菜单项(ActionSet方式实现)

    ActionSet方式比起Command方式,比较直观,但是功能有限. 首先:新建一个项目,在Extension中添加org.eclipse.ui.actionSets的扩展. 然后,new-> ...

  6. Cannot instantiate the type List&lt;Integer&gt;

    在使用java.util.List; 的时候,把语句写成了: List<Integer> arr = new List<Integer>(); 导致错误: Cannot ins ...

  7. Java解惑七:很多其它类之谜

    谜题66 继承的问题. 对于实例方法:命名同样时,子类会覆写父类的方法,且訪问权限至少和父类一样大. 对于域:命名同样时,子类会隐藏父类的域,且訪问权限随意. 谜题67 不要重用库中的类名. 谜题68 ...

  8. 策略模式——MFC样例

    Context(应用场景): 1.须要使用ConcreteStrategy提供的算法. 2.内部维护一个Strategy的实例. 3. 负责动态设置执行时Strategy详细的实现算法. 4.负责跟S ...

  9. Codeforces Round #256 (Div. 2) C. Painting Fence 或搜索DP

    C. Painting Fence time limit per test 1 second memory limit per test 512 megabytes input standard in ...

  10. shell脚本中的数学运算

    shell中的赋值和操作默认都是字符串处理,在此记下shell中进行数学运算的几个特殊方法.以后用到的时候能够来看,呵呵 1.错误方法举例 a) var=1+1 echo $var 输出的结果是1+1 ...