zoukankan      html  css  js  c++  java
  • 乐在其中设计模式(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
    [源码下载]
  • 相关阅读:
    关于vue中的语法糖v-model
    Cocos2d-x shader学习1: 灰度shader
    nginx多域名配置
    lua和c的亲密接触
    LeetCode 2. Add Two Numbers 解题报告
    LeetCode 1. Two Sum 解题报告
    【翻译】LPeg编程指南
    Cocos2d-x中的CC_CALLBACK_X详解
    C++ 11 学习3:显示虚函数重载(override)
    C++ 11 学习2:空指针(nullptr) 和 基于范围的for循环(Range-based for loops)
  • 原文地址:https://www.cnblogs.com/webabcd/p/752808.html
Copyright © 2011-2022 走看看