admin管理员组文章数量:1621906
没有中介者的情况下:
class Program { static void Main(string[] args) { Player a = new PlayerA(50); Player b = new PlayerA(100); a.Win(30,b); Console.WriteLine(a.Money); Console.WriteLine(b.Money); Console.ReadKey(); } } abstract class Player { public decimal Money { get; set; } public abstract void Win(decimal money, Player player); } class PlayerA : Player { public PlayerA(decimal money) { this.Money = money; } public override void Win(decimal money, Player player) { this.Money += money; player.Money -= money; } } class PlayerB : Player { public PlayerB(decimal money) { this.Money = money; } public override void Win(decimal money, Player player) { this.Money += money; player.Money -= money; } }
虽然使用了抽象类,降低了各个玩家之间的耦合度,但是一个玩家的状态发生变化,会影响其他所有玩家状态的变化.
中介者模式:
class Program { static void Main(string[] args) { Player a = new PlayerA(50); Player b = new PlayerB(100); Mediator m = new ConcreteMediator(a, b); a.Win(20, m); Console.WriteLine(a.Money);//70 Console.WriteLine(b.Money);//80 b.Win(50, m); Console.WriteLine(a.Money);//20 Console.WriteLine(b.Money);//130 Console.ReadKey(); } } /// <summary> /// 中介者抽象类 /// </summary> abstract class Mediator { public Player A { get; set; } public Player B { get; set; } protected Mediator(Player a, Player b) { this.A = a; this.B = b; } public abstract void AWin(decimal money); public abstract void BWin(decimal money); } /// <summary> /// 具体中介者 /// </summary> class ConcreteMediator : Mediator { public ConcreteMediator(Player a, Player b) : base(a, b) { } public override void AWin(decimal money) { A.Money += money; B.Money -= money; } public override void BWin(decimal money) { B.Money += money; A.Money -= money; } } /// <summary> /// 玩家抽象类 /// </summary> abstract class Player { public decimal Money { get; set; } public abstract void Win(decimal money, Mediator mediator); } /// <summary> /// 玩家A /// </summary> class PlayerA : Player { public PlayerA(decimal money) { this.Money = money; } public override void Win(decimal money, Mediator mediator) { mediator.AWin(money); } } /// <summary> /// 玩家B /// </summary> class PlayerB : Player { public PlayerB(decimal money) { this.Money = money; } public override void Win(decimal money, Mediator mediator) { mediator.BWin(money); } }
这种方式也有缺点,如果还要加入新的玩家,就不得不修改 Mediator 类, 增加 Player C ,和 CWin() 方法,这显然违背了开闭原则.
结合观察者模式
class Program { static void Main(string[] args) { Player a = new PlayerA(50); Player b = new PlayerB(100); Mediator m = new ConcreteMediator(); m.AddPlayer(a); m.AddPlayer(b); a.Win(20, m); Console.WriteLine(a.Money);//70 Console.WriteLine(b.Money);//80 //c 加入进来 Player c = new PlayerC(200); m.AddPlayer(c); b.Win(140, m); Console.WriteLine(a.Money);//0 Console.WriteLine(b.Money);//220 Console.WriteLine(c.Money);//130 //a 输完了,走了,b,c继续玩 m.RemovePlayer(a); c.Win(220,m); Console.WriteLine(b.Money);//0 Console.WriteLine(c.Money);//350 Console.ReadKey(); } } /// <summary> /// 中介者抽象类 /// </summary> abstract class Mediator { public List<Player> PlayerList = new List<Player>(); public void AddPlayer(Player player) { this.PlayerList.Add(player); } public void RemovePlayer(Player player) { this.PlayerList.Remove(player); } public abstract void Win(decimal money, Player player); } /// <summary> /// 具体中介者 /// </summary> class ConcreteMediator : Mediator { public override void Win(decimal money, Player player) { int count = PlayerList.Count; foreach (var item in PlayerList) { if (item.Equals(player)) item.Money += money; else item.Money -= money / (count - 1); } } } /// <summary> /// 玩家抽象类 /// </summary> abstract class Player { public decimal Money { get; set; } public abstract void Win(decimal money, Mediator mediator); } /// <summary> /// 玩家A /// </summary> class PlayerA : Player { public PlayerA(decimal money) { this.Money = money; } public override void Win(decimal money, Mediator mediator) { mediator.Win(money, this); } } /// <summary> /// 玩家B /// </summary> class PlayerB : Player { public PlayerB(decimal money) { this.Money = money; } public override void Win(decimal money, Mediator mediator) { mediator.Win(money, this); } } /// <summary> /// 玩家C /// </summary> class PlayerC : Player { public PlayerC(decimal money) { this.Money = money; } public override void Win(decimal money, Mediator mediator) { mediator.Win(money, this); } }
转载于:https://wwwblogs/refuge/p/8544345.html
版权声明:本文标题:行为型模式 - 中介者模式 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/xitong/1728851609a1176741.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论