原文:乐在其中设计模式(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. Cordova/Phonegap 升级至 2.8.1

    相关链接 Apache Cordova 项目首页: http://cordova.apache.org/ Apache Cordova 历史版本列表: http://archive.apache.or ...

  2. 【VB/.NET】Converting VB6 to VB.NET 【Part II】【之四】

    第四部分 原文 DLLs, DAO, RDO, ADO, and AD.NET; the History of VB DBs In the early versions of VB, there we ...

  3. 【ASP.NET】验证控件

    在软件开发中,验证输入信息是否正确,这是不可缺少的一项工作.就拿我们做过的机房收费系统来说,在登录的时候,我们须要对username和用户password进行验证.推断是否为空,推断输入字符是否合理等 ...

  4. Session为空的一种原因

    在维护一份比较老的代码,想改为ajax调用,然后就添加了一个一般处理程序文件,也就是以.ashx结尾的文件,一切都正常,但发现session一直为空,很奇怪 基本的代码如下: public class ...

  5. MVC之文件上传1

    MVC之文件上传 前言 这一节我们来讲讲在MVC中如何进行文件的上传,我们逐步深入,一起来看看. Upload File(一) 我们在默认创建的项目中的Home控制器下添加如下: public Act ...

  6. 使用注解实现 bean 转 csv

    csv 文件是 aaa,bbb,ccc aaa,bbb,ccc 保存 这里的要求是 List<T> 线性表的类型 转换成 类别似 html 中 table的格式,即第一行是 head 后面 ...

  7. 如何收集 EBS 各种相关业务的表的数据

    1. Receiving 相关 參照 Note: 402245.1, 跑 rcv11i_sa.sql 就能够, 输入 po number, 其余默认. 參照 Note: 1294177.1, 假设上面 ...

  8. jquery validation remote depends 验证触发条件

    背景: 1:简介页面的变化: 2:邮箱不能反复 改动页面,邮箱默认带出,但字段上带有remote验证.不能反复,焦点由邮箱输入框失去时.会默认触发remote验证. 介绍完成 watermark/2/ ...

  9. U8Linux磁盘与文件系统管理

    1.扇区为最小的物理存储单位,每个扇区为512bytes;将扇区组成一个圆,那就是柱面,柱面是分区的最小单位.Linux系统的EX2文件系统:inode的内容用于记录文件的权限与相关属性. 至于blo ...

  10. php 禁止 URL 直接访问 php文件

    通过判断访问来源来实现. $fromurl="http://www.111.com/index.php"; //只能从这个地址访问 if( $_SERVER['HTTP_REFER ...