23种设计模式----中介者模式(Mediator Pattern)

中介者模式,定义了一个中介对象来封装一系列对象之间的交互关系。中介者使各个对象之间不须要显式地相互引用,从而使耦合性下降,并且能够独立地改变它们之间的交互行为。web

中介者模式设计两个具体对象,一个是用户类,另外一个是中介者类,根据针对接口编程原则,则须要把这两类角色进行抽象,因此中介者模式中就有了4类角色,它们分别是:抽象中介者角色,具体中介者角色、抽象同事类和具体同事类。中介者类是起到协调各个对象的做用,则抽象中介者角色中则须要保存各个对象的引用。编程

public abstract class AbstractCardPartner
{
    public int money { get; set; }
    public abstract void ChangeCount(int count, AbstractMedia media);
}

public class ParterA : AbstractCardPartner
{
    public override void ChangeCount(int count, AbstractMedia media)
    {
        media.aWin(count);
    }
} 

public class ParterB : AbstractCardPartner
{
    public override void ChangeCount(int count, AbstractMedia media)
    {
        media.bWin(count);
    }
}

public abstract class AbstractMedia
{
    public AbstractCardPartner a { get; set; }
    public AbstractCardPartner b { get; set; }
    public AbstractMedia(AbstractCardPartner a,AbstractCardPartner b)
    {
        this.a = a;
        this.b = b;
    }
    public abstract void aWin(int count);
    public abstract void bWin(int count);
}

public class MediatorPater : AbstractMedia
{
    public MediatorPater(AbstractCardPartner a, AbstractCardPartner b) : base(a, b)
    {
    }

    public override void aWin(int count)
    {
        a.money += count;
        b.money -= count;
    }

    public override void bWin(int count)
    {
        a.money -= count;
        b.money += count;
    }
}

static void Main(string[] args)
    {
        AbstractCardPartner a = new ParterA();
        AbstractCardPartner b = new ParterB();
        a.money = 20;
        b.money = 10;
        AbstractMedia ab = new MediatorPater(a, b);
        a.ChangeCount(1, ab);
        Console.WriteLine("A 如今的钱是:{0}", a.money);
        Console.WriteLine("B 如今的钱是:{0}", b.money);

        // B 赢了
        b.ChangeCount(2, ab);
        Console.WriteLine("A 如今的钱是:{0}", a.money);// 应该是15
        Console.WriteLine("B 如今的钱是:{0}", b.money); // 应该是25
        Console.Read();

    }

好处:
简化了对象之间的关系,将系统的各个对象之间的相互关系进行封装,将各个同事类解耦,使得系统变为松耦合。
提供系统的灵活性,使得各个同事对象独立而易于复用。
缺点:
中介者模式中,中介者角色承担了较多的责任,因此一旦这个中介者对象出现了问题,整个系统将会受到重大的影响。例如,QQ游戏中计算欢乐豆的程序出错了,这样会形成重大的影响
新增长一个同事类时,不得不去修改抽象中介者类和具体中介者类,此时能够使用观察者模式和状态模式来解决这个问题。ide