zoukankan      html  css  js  c++  java
  • C# 设计模式-中介者模式

    一.介绍  

      中介者模式(Mediator Pattern)。属于行为型模式。用一个中介对象来封装一序列的对象交互。中介者使得各对象之间不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

    二.实现

      举个例子,用户聊天,A用户发了消息,B用户就能收到。B用户发的消息,A用户可以收到。按照一般的做法,A、B想要交互是需要两个类相互关联,这样A、B两类就会耦合,A类的变化就有可能影响到B类。使用中间者模式,就是在A类和B类的用户类中加个中间者类,A、B的交互通过中间者类处理,这样如果A类变动,会影响到的,也就只有A类和中间者类,减少用户类之间的耦合。

    //抽象中介者
    public abstract class Mediator
    {
        public abstract void Send(string message, Colleague colleague);
    }
    //具体中介者
    public class ConcreteMediator : Mediator
    {
        private ColleagueA a;
        private ColleagueB b;
        public void SetColleague(ColleagueA a, ColleagueB b)
        {
            this.a = a;
            this.b = b;
        }
    
        public override void Send(string message, Colleague colleague)
        {
            if (colleague == this.a)
            {
                b.NotifyB(message);
            }
            else
            {
                a.NotifyA(message);
            }
        }
    }
    
    //抽象用户
    public abstract class Colleague
    {
        protected Mediator mediator;
        public Colleague(Mediator mediator)
        {
            this.mediator = mediator;
        }
        public abstract void Send(string message);
    }
    //具体用户
    public class ColleagueA : Colleague
    {
        public ColleagueA(Mediator mediator) : base(mediator)
        {
        }
    
        public override void Send(string message)
        {
            mediator.Send(message, this);
        }
        public void NotifyA(string message)
        {
            Console.WriteLine($"A get message:{message}");
        }
    }
    //具体用户
    public class ColleagueB : Colleague
    {
        public ColleagueB(Mediator mediator) : base(mediator)
        {
        }
    
        public override void Send(string message)
        {
            mediator.Send(message, this);
        }
        public void NotifyB(string message)
        {
            Console.WriteLine($"B get message:{message}");
        }
    }
    
    //调用
    public static void Main(string[] args)
    {
        ConcreteMediator mediator = new ConcreteMediator();
        ColleagueA a = new ColleagueA(mediator);
        ColleagueB b = new ColleagueB(mediator);
    
        mediator.SetColleague(a, b);
        a.Send("A send a message");
        b.Send("B send a message");
    }

    三.总结

      优点:

      1.简化了对象之间的关系,将系统中各个对象之间的相互关系进行封装,将各个用户类解耦,使系统变得松耦合。

      2.提高系统的灵活性,使得各个用户类对象独立而易于复用。

      缺点:

      1.中介者模式中,中介者角色承担了较多的责任,所以一旦这个中介者对象出了问题,整个系统都是受到严重的影响。

      2.新加一个用户类后,不得不修改抽象中介者和具体中介者对象。

  • 相关阅读:
    ADX3000的组网配置
    cuda编程知识普及
    最优的cuda线程配置
    JBOSS在win7环境下启动run.bat无反应
    2013年8月第2个周结
    JBOSS AS 性能调整优化
    jquery插入第一个元素? [问题点数:20分,结帖人zsw19909001]
    @Inject 注入 还是报空指针
    css3 box-shadow阴影(外阴影与外发光)讲解
    事务模板
  • 原文地址:https://www.cnblogs.com/shadoll/p/14377291.html
Copyright © 2011-2022 走看看