定义:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
个人理解:各个类之间的通信不是直接进行,而是通过一个中间者来转发,那么就要求中间者了解所有的类,类中要有中间者,这样类和类之间就可以不用直接关联了。
1、中间者和要通信的类的抽象类
1 //Mediator类 抽象中介者类,定义一个抽象的发送信息方法,得到同事对象和发送信息 2 abstract class Mediator 3 { 4 public abstract void Send(string message,Person person); 5 } 6 7 //Person类,在构者该对象时要得到中介者 8 abstract class Person 9 { 10 public Mediator mediator; 11 public Person(Mediator mediator) 12 { 13 this.mediator = mediator; 14 } 15 }
2、具体的中介者类
1 //具体的中介者 2 class ConcreteMediator : Mediator 3 { 4 //要了解所有需要通过中介者传达信息的人 5 public ConcretePersonOne personOne { get; set; } 6 public ConcretePersonTwo personTwo { get; set; } 7 8 public override void Send(string message, Person person) 9 { 10 //如果发送信息的人是第一个人,则第二个人接收信息,否则第一个人接收信息 11 if (person == personOne) 12 { 13 personTwo.Notify(message); 14 } 15 else 16 { 17 personOne.Notify(message); 18 } 19 } 20 }
3、具体的人类
1 //具体的人类 2 class ConcretePersonOne : Person 3 { 4 //父构造函数需要参数Mediator 5 public ConcretePersonOne(Mediator mediator) : base(mediator) { } 6 7 //发送信息的方法,其实就是通过中介者发送的 8 public void Send(string message) 9 { 10 mediator.Send(message,this); 11 } 12 13 //接收信息的方法 14 public void Notify(string message) 15 { 16 Console.WriteLine("我是第一类人,我收到了信息:" + message); 17 } 18 19 } 20 21 class ConcretePersonTwo : Person 22 { 23 public ConcretePersonTwo(Mediator mediator) : base(mediator) { } 24 25 public void Send(string message) 26 { 27 mediator.Send(message,this); 28 } 29 30 public void Notify(string message) 31 { 32 Console.WriteLine("我是第二类人,我收到信息:" + message); 33 } 34 }
4、客户端
static void Main(string[] args) { //创建一个中间者 ConcreteMediator cm = new ConcreteMediator(); //创建两类要通信的人 ConcretePersonOne p1 = new ConcretePersonOne(cm); ConcretePersonTwo p2 = new ConcretePersonTwo(cm); //向中介者中加入要通信的人 cm.personOne = p1; cm.personTwo = p2; //p1和p2要发信息 p1.Send("I love you"); p2.Send("I love you too"); Console.Read(); }