标签:
定义了一个中介对象来封装一系列对象之间的交互关系。中介者使各个对象之间不需要显示低相互引用。降低耦合度,并且可以独立改变他们的交互行为。
小明和女神今天做了一个非常有意义的事情。他们俩在一个房间里,剪刀石头布,并且还赌钱。
小明赢了的话,十块钱。女神赢了的话,五块钱。
这个时候,我们就要结合一下设计模式了。
首先,我们用观察者模式,让小明和女神加入到这个游戏中。
接着,我们用状态模式,来分别创建小明赢和女神赢的情况。
最后,我们用中介者模式关联这两个对象。
我们来创建玩家这个抽象类。首先玩家肯定得有钱才能玩,那么我们构造函数把有多少钱传进去。
接着我们定义一个修改钱的方法,把钱数和中介者类传进来。
public abstract class AbstractPlayer { public int Money { get; set; } public AbstractPlayer() { Money = 0; } public abstract void Change(int count, AbstractMediator mediator); }
我们接下来,定义小明和女神这两个人。并且让他们实现抽象类。并且在修改钱的方法的时候,让中介者去操作这些钱。
public class SomgM : AbstractPlayer { public override void Change(int count, AbstractMediator mediator) { mediator.Change(count); } } public class NvShen : AbstractPlayer { public override void Change(int count, AbstractMediator mediator) { mediator.Change(count); } }
我们来创建中介者,让他关联状态和玩家类。
//创建中介者来管理玩家和玩家的钱 public abstract class AbstractMediator { public List<AbstractPlayer> list = new List<AbstractPlayer>(); public State State { get; set; } public AbstractMediator(State state) { this.State = state; } public void Change(int Count) { State.Change(Count); } public void Enter(AbstractPlayer partner) { list.Add(partner); } } public class MediatorPater : AbstractMediator { public MediatorPater(State initState) : base(initState) { Console.WriteLine("中介者创建完毕,可以对钱进行操作了"); } }
这里我们,Change方法,直接调用状态的方法。Enter方法用来添加玩家。
我们来创建状态类,状态一共有三种,赢,输,平局。我们先抽象一个方法,并且实现这三种状态。
//创建状态类 public abstract class State { protected AbstractMediator mediator; public abstract void Change(int Count); } //小明赢 public class AWin : State { public AWin(AbstractMediator abMedia) { this.mediator = abMedia; } public override void Change(int Count) { foreach (AbstractPlayer p in mediator.list) { SomgM m = p as SomgM; if (m != null) m.Money += Count; else p.Money -= Count; } } } //女神赢 public class BWin : State { public BWin(AbstractMediator abMedia) { this.mediator = abMedia; } public override void Change(int Count) { foreach (AbstractPlayer p in mediator.list) { NvShen n = p as NvShen; if (n != null) n.Money += Count; else p.Money -= Count; } } } //平局 public class Init : State { public Init() { Console.WriteLine("平局"); } public override void Change(int Count) { return; } }
主要就是状态初始化的时候,需要传中介者进去。
我们调用一下
private static void Main(string[] args) { //初始化 AbstractPlayer someM = new SomgM(); AbstractPlayer nvShen = new NvShen(); //初始金钱 someM.Money = 20; nvShen.Money = 20; //初始中介者,初始平局状态 AbstractMediator mediator = new MediatorPater(new Init()); //女神和小明,加入游戏 mediator.Enter(someM); mediator.Enter(nvShen); //小明赢了 mediator.State = new AWin(mediator); mediator.Change(10); //女神赢了 mediator.State = new BWin(mediator); mediator.Change(5); //双方的钱 Console.WriteLine("小明 现在钱:{0}", someM.Money); Console.WriteLine("女神 现在钱:{0}", nvShen.Money); Console.ReadLine(); }
主要就是封装了一系列对象之间的调用关系。使用中介者模式的话,双方不需要相互引用。从而降低耦合度。
常用场景:一个系列的对象交互关系十分复杂。
选择关键点:复杂的交互关系是否有共性可被中介者承担。
标签:
原文地址:http://www.cnblogs.com/chenxygx/p/5004450.html