zoukankan      html  css  js  c++  java
  • 二十四种设计模式:中介者模式(Mediator Pattern)

    中介者模式(Mediator Pattern)


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


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

  • 相关阅读:
    c++ map 的基本操作
    hdu Dragon Balls
    hdu Code Lock
    小技巧——直接在目录中输入cmd然后就打开cmd命令窗口
    将.py脚本打包成.exe
    关于IO同步/异步/阻塞/非阻塞文章
    C++文件操作
    (十)参考教程
    (八)树控件(Tree Control),标签控件(tab control)
    (七)对话框,单选框(radiobox),复选框(checkbox),列表框(ListBox),组合框(CComboBox),水平滚动条(Horizontal scroll bar),微调(旋转)spincontrol,列表视图控件CListCtrl,静态控件static
  • 原文地址:https://www.cnblogs.com/taotaodetuer/p/6183008.html
Copyright © 2011-2022 走看看