您的位置:首页 > 其它

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

2019-03-12 10:20 225 查看

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

中介者模式设计两个具体对象,一个是用户类,另一个是中介者类,根据针对接口编程原则,则需要把这两类角色进行抽象,所以中介者模式中就有了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游戏中计算欢乐豆的程序出错了,这样会造成重大的影响
新增加一个同事类时,不得不去修改抽象中介者类和具体中介者类,此时可以使用观察者模式和状态模式来解决这个问题。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: