Mediator.cs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace MediatorPattern
  7. {
  8. /// <summary>
  9. /// 抽象角色(模块)
  10. /// 主要实现中介的依赖注入
  11. /// </summary>
  12. public abstract class Role
  13. {
  14. protected AbstractMediator mediator;
  15. public Role(AbstractMediator mediator)
  16. {
  17. this.mediator = mediator;
  18. }
  19. }
  20. /// <summary>
  21. /// 购房(者)市场
  22. /// </summary>
  23. public class HomeBuyer : Role
  24. {
  25. private readonly string name = "购房市场:";
  26. public HomeBuyer(AbstractMediator mediator)
  27. : base(mediator)
  28. {
  29. }
  30. private static int requirement = 800;//购房需求
  31. public void BuyHouse(int num)
  32. {
  33. string rule = mediator.GetRule();
  34. Console.WriteLine(name + "需要买房:" + num + "套");
  35. if (rule != "LimitBuy")
  36. {
  37. requirement += num;
  38. }
  39. else
  40. {
  41. Console.WriteLine(name + "国家实例了限购政策,不允许购买");
  42. }
  43. }
  44. /// <summary>
  45. /// 签订购房合同
  46. /// </summary>
  47. /// <param name="num"></param>
  48. public void SignAgreement(int num)
  49. {
  50. requirement -= num;
  51. Console.WriteLine(string.Format("{0}成功购房{1}套", name, num));
  52. }
  53. public int GetRequirement()
  54. {
  55. return requirement;
  56. }
  57. }
  58. /// <summary>
  59. /// 房地产商
  60. /// </summary>
  61. public class Builder : Role
  62. {
  63. private readonly string name = "房地产商:";
  64. public Builder(AbstractMediator mediator)
  65. : base(mediator)
  66. {
  67. }
  68. private static int houseNum = 1000;
  69. public void BuildHouse()
  70. {
  71. int requirement = mediator.GetBuyRequirement();
  72. if (houseNum < requirement)
  73. {
  74. //房源不够,立马新建
  75. int needBuild = requirement - houseNum + 100;
  76. Console.WriteLine(name + "建房:" + needBuild + "套");
  77. houseNum += needBuild;
  78. }
  79. }
  80. public void SaleHouse(int num)
  81. {
  82. if (houseNum < num)
  83. {
  84. string rule = mediator.GetRule();
  85. if (rule != "LimitBuild")
  86. {
  87. Console.WriteLine(name + "房源不够,正在建设中");
  88. this.BuildHouse();
  89. }
  90. }
  91. else
  92. {
  93. houseNum -= num;
  94. Console.WriteLine(name + "卖房:" + num + "套");
  95. //告诉购房者签订合同
  96. mediator.HomeBuyer.SignAgreement(num);
  97. }
  98. }
  99. public int ShowHouseNum()
  100. {
  101. return houseNum;
  102. }
  103. }
  104. /// <summary>
  105. /// 住建局
  106. /// </summary>
  107. public class ControlCenter : Role
  108. {
  109. public ControlCenter(AbstractMediator mediator)
  110. : base(mediator)
  111. {
  112. }
  113. private readonly string name = "住建局:";
  114. private static string rule;
  115. /// <summary>
  116. /// 当需大于供,限购
  117. /// 当供大于需,限建
  118. /// </summary>
  119. public void Limit()
  120. {
  121. int requirement = mediator.GetBuyRequirement();
  122. int buildingNum = mediator.GetCurrentHouseNumber();
  123. string strs = string.Format("{0}目前购房需求为:{1}套;现有房源:{2}套。", name,requirement, buildingNum);
  124. if (requirement > buildingNum)
  125. {
  126. Console.WriteLine(strs + "供小于需,开始实施限购政策");
  127. rule = "LimitBuy";
  128. }
  129. else
  130. {
  131. Console.WriteLine(strs + "供大于需,开始实施限建政策");
  132. rule = "LimitBuild";
  133. }
  134. }
  135. public string ShowRule()
  136. {
  137. return rule;
  138. }
  139. }
  140. /// <summary>
  141. /// 抽象中介,定义各模块依赖的功能
  142. /// </summary>
  143. public abstract class AbstractMediator
  144. {
  145. /// <summary>
  146. /// 使用属性注入
  147. /// 因为中介可能只需要和部分角色(模块)交互
  148. /// </summary>
  149. public HomeBuyer HomeBuyer { get; set; }
  150. public Builder HouseBuilder { get; set; }
  151. public ControlCenter ControlCenter { get; set; }
  152. /// <summary>
  153. /// 获取购房需求
  154. /// </summary>
  155. /// <returns></returns>
  156. public abstract int GetBuyRequirement();
  157. /// <summary>
  158. /// 获取房源数目
  159. /// </summary>
  160. /// <returns></returns>
  161. public abstract int GetCurrentHouseNumber();
  162. /// <summary>
  163. /// 获取楼市政策
  164. /// </summary>
  165. /// <returns></returns>
  166. public abstract string GetRule();
  167. }
  168. /// <summary>
  169. /// 具体中介,实现各模块依赖的功能
  170. /// </summary>
  171. public class Mediator : AbstractMediator
  172. {
  173. public override int GetBuyRequirement()
  174. {
  175. return base.HomeBuyer.GetRequirement();
  176. }
  177. public override int GetCurrentHouseNumber()
  178. {
  179. return base.HouseBuilder.ShowHouseNum();
  180. }
  181. public override string GetRule()
  182. {
  183. return base.ControlCenter.ShowRule();
  184. }
  185. }
  186. }