Administrator
发布于 2024-08-03 / 36 阅读
0
0

中介者模式

问题描述

刚进公司的新人需要其他部门同事帮助是有困难的,但是通过主管协调就会简单很多。

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

代码实现

中介者抽象类

    public abstract class Mediator
    {
        public abstract void send(string msg, Colleague colleague);
    }

同事抽象类

    public abstract class Colleague
    {
        protected Mediator mMediator;
        public Colleague(Mediator mediator)
        {
            mMediator = mediator;
        }
    }

同事具体实现类

public class ConcreateColleague1:Colleague
{
    public ConcreateColleague1(Mediator mediator) : base(mediator) { }

    public void Send(string msg)
    {
        mMediator.send(msg, this);
    }

    public void Notify(string msg)
    {
        Console.WriteLine($"同事1得到消息:{msg}");
    }
}

public class ConcreateColleague2 : Colleague
{
    public ConcreateColleague2(Mediator mediator) : base(mediator) { }

    public void Send(string msg)
    {
        mMediator.send(msg, this);
    }

    public void Notify(string msg)
    {
        Console.WriteLine($"同事2得到消息:{msg}");
    }
}

中介者具体实现类

    public class  ConcreateMediator:Mediator
    {
        protected ConcreateColleague1 mColleague1;
        protected ConcreateColleague2 mColleague2;
        public ConcreateMediator():base() { }

        public void SetColleague1(ConcreateColleague1 colleague1)
        {
            mColleague1 = colleague1;
        }

        public void SetColleague2(ConcreateColleague2 colleague2)
        {
            mColleague2 = colleague2;
        }

        public override void send(string msg,Colleague colleague)
        {
            if (colleague == mColleague1)
                mColleague2.Notify(msg);
            else
                mColleague1.Notify(msg);
        }
        
    }

Main方法

    internal class Program
    {
        static void Main(string[] args)
        {
            ConcreateMediator mediator = new ConcreateMediator();
            ConcreateColleague1 colleague1 = new ConcreateColleague1(mediator);
            ConcreateColleague2 colleague2 = new ConcreateColleague2(mediator);
            mediator.SetColleague1(colleague1);
            mediator.SetColleague2(colleague2); 
            colleague1.Send("别卷了,下班吧");
            colleague2.Send("等我一分钟,一起走");

        }
    }

运行结果

同事2得到消息:别卷了,下班吧
同事1得到消息:等我一分钟,一起走

UML图


评论