原文:乐在其中设计模式(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. 使用Swing实现简易而不简单的文档编辑器

    本文通过Swing来实现文档简易而不简单的文档编辑器,该文档编辑器的功能包括: 设置字体样式:粗体,斜体,下划线,可扩展 设置字体:宋体,黑体,可扩展 设置字号:12,14,18,20,30,40, ...

  2. hdu3062(two-sat)

    传送门:Party 题意:有n对夫妻被邀请参加一个聚会,因为场地的问题,每对夫妻中只有1人可以列席.在2n 个人中,某些人之间有着很大的矛盾(当然夫妻之间是没有矛盾的),有矛盾的2个人是不会同时出现在 ...

  3. hdu 4888 Redraw Beautiful Drawings 最大流

    好难好难,将行列当成X和Y,源汇点连接各自的X,Y集,容量为行列的和,相当于从源点流向每一行,然后分配流量给每一列,最后流入汇点,这样执意要推断最后是否满流,就知道有没有解,而解就是每一行流向每一列多 ...

  4. 苹果iOS手机系统诊断功能是后门吗?

    7月20日,美国知名苹果iOS手机系统侦破专家扎德尔斯基在2014年世界黑客大会(HOPE/X)用幻灯片讲演揭露了苹果手机存在系统级"后门". 为此,7月23日.苹果公司马上做出回 ...

  5. JDBC/XML的一些基本使用

    原文:JDBC/XML的一些基本使用 一.知识点题目:JDBC核心API的使用 关键字:JDBC核心API 内容: 1)加载JDBC驱动: Oracle:Class.forName(“oracle.j ...

  6. Swift编程语言学习10—— 枚举属性监视器

    属性监视器 属性监视器监控和响应属性值的变化,每次属性被设置值的时候都会调用属性监视器.甚至新的值和如今的值同样的时候也不例外. 能够为除了延迟存储属性之外的其它存储属性加入属性监视器,也能够通过重载 ...

  7. [cocos2dx-lua]&quot;Hello Lua&quot;分析

    一年之前学的cocos2dx,那时候还是用C++编写的.但学完之后就找的一个新的方向--Unity3D开发的岗位,对我而言是一个新方向,那时候经过了几个月的每天熬夜奋战,从"0"基 ...

  8. Net分布式系统

    Net分布式系统 Net分布式系统之三:Keepalived+LVS+Nginx负载均衡之高可用 摘要: 上一篇写了nginx负载均衡,此篇实现高可用(HA).系统整体设计是采用Nginx做负载均衡, ...

  9. NPOI 创建Excel,数据读取与写入

    <1> using System; using System.Collections.Generic; using System.Linq; using System.Web; using ...

  10. Android基于cordova3.3插件开发

    最近的工作项目,需要使用cordova插件开发,详细Cordova角色,不会走,你可以去百度自身OK该,直接启动.详细过程,我有一个小Demo解说提前进行. 还只是接触,东西太理论基础,我也不太清楚, ...