原文:乐在其中设计模式(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. 黑马程序员:Java基础总结----类加载器

    黑马程序员:Java基础总结 类加载器   ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 类加载器 Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个 ...

  2. A股市场暴跌背后的三大元凶?

    周一两市低开低走,盘中空方连续打压股指,大盘一路下行,沪指2000点关口告急,收于1963.24点,跌幅超过了5%.行业板块全线溃败.银行.证券领衔大幅杀跌,板块跌幅一度超过5%:继上周五中国石油A股 ...

  3. Android中G-Sensor相关流程

    1.使G-sensor正常工作需要做的事: G-sensor driver文件包括: driver/i2c/chips/lis331dl.c driver/i2c/chips/sensorioctl. ...

  4. vim忽略大写和小写查找配置

    作者:zhanhailiang 日期:2014-12-17 默认 vim 的查找是区分大写和小写,可通过下面两种方式实现忽略大写和小写查找 set ic? noignorecase 1 指令设定: : ...

  5. Unobtrusive Ajax

    ASP.NET MVC之Unobtrusive Ajax(五)   前言 这一节我们来讲讲Unobtrusive中的Ajax提交,大部分情况下我们是利用JQuery来进行Ajax请求,当然利用JQue ...

  6. hdu1540(线段树)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1540 题意:是一条线上的点,D x是破坏这个点,Q x是表示查询以x所在的最长的连续的点的个数,R是恢 ...

  7. Debian7.6安装过程中遇到的问题

    一 sudo命令不能用 1 使用su切换到root用户,命令: su 2 使用名:vim /etc/sudoers加入sudoer用户,命令: vim /etc/sudoers 找到root=(ALL ...

  8. 分布式消息系统Jafka入门指南之二

    分布式消息系统Jafka入门指南之二 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs 三.Jafka的文件夹结构 1.安装tree命令 $ sudo yu ...

  9. ie6下margin双倍距的问题

    今天中午休息时, 公司客服突然报出来一个bug, 一个用ie6的用户打开我们活动网站时, 发现内容都错乱了, 我赶紧上线一看, 发现是正常的. 找了台ie6的xp机器再看了下, 重现出了这个用户的问题 ...

  10. 关于埃博拉(Ebola)基础研究病毒

    关于埃博拉(Ebola)病毒的基础研究 2005年.美国哈佛大学医学研究院(Harvard Medical School)James Cunningham教授关于埃博拉病毒有一项基础研究,研究成果发表 ...