看着好像直接高效

时间:2021-10-21 06:30:43

原文:C#设计模式之十七中介者模式(Mediator Pattern)【行为型】

一、引言

   今天我们开始讲“行为型”设计模式的第五个模式,该模式是【中介者模式】,英文名称是:Mediator Pattern。还是老套路,先从名字上来看看。“中介者模式”我第一次看到这个名称,我的理解是,在两个东西中间增加一个“中间东西”,“中间东西”协调两个东西的关系,但是跟着理解的深入,“中间东西”措置惩罚惩罚关系的东西可能不但是两个东西,可能是三个东西,或者更多东西。中介者模式在现实生活中的例子很多,好比:A东西和B东西做生意,如果A东西和B东西是一次性买卖,没有讨价还价的过程,A东西和B东西直接见面更好。但是A东西或者B东西的想法经常变,每次想法的转变都通知对方,就会使对方很反感,而且也倒霉于生意的顺利进行。如果在A东西和B东西之间增加一个C东西,在最终确定之前不要报告C东西,对方也就不知道(断绝了耦合,对方可以更具需求变革),等一方最终确定想法后,把最后决定报告C东西,C东西再转告对方,这样就简化了A东西和B东西的交易过程,而且双方都很对劲。在软件构建过程中,因为有了变革,才有增加中介者的需要,如果没有变革,可以一次搞定,直接硬编码也不妨,所以说“变革”是模式的前提,无论是什么模式,就因为有变革,我们需要抵制变革,才要使用相应的模式来解决问题。

二、中介者模式的详细介绍

2.1、动机(Motivate)

   在软件构建过程中,经常会呈现多个东西互相关联交互的情况,东西之间每每会维持一种庞大的引用关系,如果遇到一些需求的变动,这种直接的引用关系将面临不停地变革。

  在这种情况下,我们可使用一个“中介东西”来打点东西间的关联关系,制止彼此交互的东西之间的紧耦合引用关系,从而更好地抵制变革。

2.2、意图(Intent)

   界说了一其中介东西来封装一系列东西之间的交互关系。中介者使各个东西之间不需要显式地彼此引用,从而使耦合性降低,而且可以独登时转变它们之间的交互行为。                                      ——《设计模式》GoF

2.3、布局图(Structure)

     

看着好像直接高效



2.4、模式的构成
    
    可以看出,在中介者模式的布局图有以下角色:

    (1)、抽象中介者角色(Mediator):在里面界说各个同事之间交互需要的要领,可以是大众的通信要领,也可以是小范畴的交互要领。

    (2)、具体中介者角色(ConcreteMediator):它需要了解并维护各个同事东西,并卖力具体的协调各同事东西的交互关系。

    (3)、抽象同事类(Colleague):凡是为抽象类,主要约束同事东西的类型,并实现一些具体同事类之间的大众成果,好比,每个具体同事类都应该知道中介者东西,也就是具体同事类城市持有中介者东西,都可以到这个类里面。

    (4)、具体同事类(ConcreteColleague):实现本身的业务,需要与其他同事通信时候,就与持有的中介者通信,中介者会卖力与其他同事类交互。


2.5、中介者模式的代码实现

    中介者模式在显示生活中也有类似的例子,岂论是QQ群或者是微信群,或者手提电话,它们都是充当一其中间平台,QQ用户可以登录这其中间平台与其他QQ用户进行交流,如果没有这些中间平台,我们如果想与伴侣进行聊天的话,可能就需要对面才可以了。好比:在公司打点过程中,就会涉及到各个部门之间的协调和合作,如何各个部门直接来相同,看着仿佛直接高效,其实不然。各个部门之间为了完成一个事情,相同协调就需要一小我私家来做这个事情,谁呢?总经理,我们这里就把总经理界说为成总的打点者,各个部门需要向他陈述请示和倡议事情请求。我们看代码吧,实现代码如下:

1 namespace 中介者模式的实现 2 { 3 //抽象中介者角色 4 public interface Mediator 5 { 6 void Command(Department department); 7 } 8 9 //总经理--相当于具体中介者角色 10 public sealed class President : Mediator 11 { 12 //总经理有各个部门的打点权限 13 private Financial _financial; 14 private Market _market; 15 private Development _development; 16 17 public void SetFinancial(Financial financial) 18 { 19 this._financial = financial; 20 } 21 public void SetDevelopment(Development development) 22 { 23 this._development = development; 24 } 25 public void SetMarket(Market market) 26 { 27 this._market = market; 28 } 29 30 public void Command(Department department) 31 { 32 if (department.GetType() == typeof(Market)) 33 { 34 _financial.Process(); 35 } 36 } 37 } 38 39 //同事类的接口 40 public abstract class Department 41 { 42 //持有中介者(总经理)的引用 43 private Mediator mediator; 44 45 protected Department(Mediator mediator) 46 { 47 this.mediator = mediator; 48 } 49 50 public Mediator GetMediator 51 { 52 get { return mediator; } 53 private set { this.mediator = value; } 54 } 55 56 //做本部门的工作 57 public abstract void Process(); 58 59 //向总经理发出申请 60 public abstract void Apply(); 61 } 62 63 //开发部门 64 public sealed class Development : Department 65 { 66 public Development(Mediator m) : base(m) { } 67 68 public override void Process() 69 { 70 Console.WriteLine("我们是开发部门,要进行项目开发,没钱了,需要资金撑持!"); 71 } 72 73 public override void Apply() 74 { 75 Console.WriteLine("专心科研,开发项目!"); 76 } 77 } 78 79 //财务部门 80 public sealed class Financial : Department 81 { 82 public Financial(Mediator m) : base(m) { } 83 84 public override void Process() 85 { 86 Console.WriteLine("陈述请示事情!没钱了,钱太多了!怎么花?"); 87 } 88 89 public override void Apply() 90 { 91 Console.WriteLine("数钱!"); 92 } 93 } 94 95 //市场部门 96 public sealed class Market : Department 97 { 98 public Market(Mediator mediator) : base(mediator) { } 99 100 public override void Process() 101 { 102 Console.WriteLine("陈述请示事情!项目承接的进度,需要资金撑持!"); 103 GetMediator.Command(this); 104 } 105 106 public override void Apply() 107 { 108 Console.WriteLine("跑去接项目!"); 109 } 110 } 111 112 113 class Program 114 { 115 static void Main(String[] args) 116 { 117 President mediator = new President(); 118 Market market = new Market(mediator); 119 Development development = new Development(mediator); 120 Financial financial = new Financial(mediator); 121 122 mediator.SetFinancial(financial); 123 mediator.SetDevelopment(development); 124 mediator.SetMarket(market); 125 126 market.Process(); 127 market.Apply(); 128 129 Console.Read(); 130 } 131 } 132 }