• 中介者(Mediator)模式


    中介者(Mediator)模式:用一个中介对象来封装一系列的对象交互,中介者使各个对象不需要显示的相互引用,从而使得耦合松散,而且可以独立的改变他们之间的交互

      了解《迪米特法则》的朋友就知道,迪米特法则说的就是:一个对象应当对其它对象有尽可能少的了解

    迪米特法则的核心观念就是类间解耦,弱耦合,只有弱耦合了以后,类的复用性才可以提高。

     Mediator: 抽象中介者, 提供一个传递双方的方法 abstract void Send(string message, Colleague colleague),所以需要Colleague 买卖双方的抽象实例。

    ConcreteMediator: 具体中介者,它的作用就是买卖双方的桥梁,所以它中介需要有 买卖双方的具体实例。 

      所以就定义ConcreteColleague1 Colleague1,ConcreteColleague2 Colleague2 买卖双方的一个属性,它就是Colleague1 Colleague2 之间的桥梁。

     Colleague: 抽象买卖商人,他们之间的传递 是靠中介者来完成的所以 需要Mediator mediator中介对象构造函数Colleague(Mediator mediator)。

    ConcreteColleague1: 具体买家1,自然也知道他委托的中介是谁,ConcreteColleague1(Mediator mediator)。

               //实例一个 m 中介者。
                ConcreteMediator m = new ConcreteMediator();
                //实例 买家 卖商家,他们的中介者都是m
                ConcreteColleague1 c1 = new ConcreteColleague1(m);
                ConcreteColleague2 c2 = new ConcreteColleague2(m);
    
                m.Colleague1 = c1;
                m.Colleague2 = c2;
    
                //买家通过中介 传话给卖家
                c1.Send("买家说-房子120W卖不");
                //卖家通过中介回复
                c2.Send("卖家说-120W你卖我10套?");
    
                Console.ReadLine();
    
    
     /// <summary>
        /// Mediator 抽象中介者
        /// </summary>
        public abstract class Mediator
        {
            public abstract void Send(string message, Colleague colleague);
        }
    
        /// <summary>
        /// Colleague 抽象同事类
        /// </summary>
        public abstract class Colleague
        {
            protected Mediator mediator;
            /// <summary>
            /// 构造函数中 得到中介者
            /// </summary> 
            public Colleague(Mediator mediator)
            {
                this.mediator = mediator;
            } 
        }
    
        /// <summary>
        /// ConcreteMediator  具体中介者
        /// </summary>
        public class ConcreteMediator : Mediator
        {
            public ConcreteColleague1 Colleague1
            { get; set; }
    
            public ConcreteColleague2 Colleague2
            { get; set; }
    
            public override void Send(string message, Colleague colleague)
            {
                if (colleague == Colleague1)
                {
                    Colleague2.Notify(message);
                }
                else
                {
                    Colleague1.Notify(message);
                }
            }
        }
    
        /// <summary>
        /// 具体买家
        /// </summary>
        public class ConcreteColleague1 : Colleague
        {
            public ConcreteColleague1(Mediator mediator)
                : base(mediator)
            { }
    
            public void Send(string message)
            {
                mediator.Send(message, this);
            }
    
            public void Notify(string message)
            {
                Console.WriteLine("买家得到信息:" + message);
            }
    
        }
    
        /// <summary>
        /// 具体卖家
        /// </summary>
        public class ConcreteColleague2 : Colleague
        {
            public ConcreteColleague2(Mediator mediator)
                : base(mediator)
            { }
    
            public void Send(string message)
            {
                mediator.Send(message, this);
            }
    
            public void Notify(string message)
            {
                Console.WriteLine("卖家得到信息:" + message);
            }
        }
  • 相关阅读:
    NFS与通配符
    yum管理RPM包与linux网络设置
    git常用命令总结——覆盖日常开发全操作
    inner join on会过滤掉两边空值的条件
    入园第一天
    P3750 [六省联考2017]分手是祝愿 题解
    CSP2021 爆零记
    CSP 前模板记录(黄题篇)
    对拍
    2021.10.20CSP模拟模拟赛 赛后总结
  • 原文地址:https://www.cnblogs.com/dragon-L/p/3792246.html
Copyright © 2020-2023  润新知