场景:与朋友通信件
描述:东北的赵大宝向山东水泊梁山的好汉王英寄了一封信
(一)实体类(用于维持数据)
public class User
{
public string Address { get; set; }
public string PostCode { get; set; }
public string Name { get; set; }
}
(二)赵大宝与王英(同事关系)抽象接口
public interface IPerson
{
User Sender{get;set;}
User Receiver{get;set;}
}
收信人的地址信息,与寄信的地址信息
(三)赵大宝
public class Zhao : IPerson
{
#region IPerson 成员
public User Sender
{
get;
set;
}
public User Receiver
{
get;
set;
}
#endregion
}
(四)王英
public class Wang : IPerson
{
#region IPerson 成员
public User Sender
{
get;
set;
}
public User Receiver
{
get;
set;
}
#endregion
}
(五)中介者抽象
public abstract class Mediator
{
public abstract void Send();
public abstract void Receive();
public abstract void Register(IPerson person);
}
注册收信人与寄信人,可以把本地信件发往各地(Send),也可以接收从其它各地寄往本地的信件(Receive)
(六)本地邮局(中介者实现)
public class Postoffice : Mediator
{
private User _sender;
private User _receiver;
public override void Send()
{
if (_receiver != null)
{
Console.WriteLine("向住在"+_receiver.Address+"的" + _receiver.Name + "寄了一封信!"+"邮编是"+_receiver.PostCode);
}
else
Console.WriteLine("没有信件邮寄!");
}
public override void Receive()
{
if (_sender != null)
{
Console.WriteLine("收到住在" + _sender.Address + "的" + _sender.Name + "寄来的一封信!" + _sender.PostCode);
}
else
Console.WriteLine("没有收到信件!");
}
public override void Register(IPerson person)
{
_sender = person.Sender;
_receiver = person.Receiver;
}
}
(七)测试
public void TestMediator()
{
IPerson zhao = new Zhao();
User _zhao = new User { Name="赵大宝", Address="东北某地", PostCode="1212121" };
User _wang = new User {Name="王英",Address="山东梁山泊",PostCode="3636363" };
zhao.Sender = _zhao;
zhao.Receiver = _wang;
Mediator mdor = new Postoffice();
mdor.Register(zhao);
mdor.Send();
mdor.Receive();
}
东北的赵大宝向山东的王英寄了一封信……
结果:
向住在山东梁山泊的王英寄了一封信!邮编是3636363
收到住在东北某地的赵大宝寄来的一封信!1212121
中介者模式要求每个同事都知道中介者,但这种方式实现,我觉得也可以。
以下是正常实现方式
(一) 实体类
用于维持数据
public class User
{
public string Address { get; set; }
public string PostCode { get; set; }
public string Name { get; set; }
}
(二) 同事抽象接口
public abstract class Person
{
protected Mediator _mediator;
User Sender { get; set; }
User Receiver { get; set; }
public abstract void SetMediator(Mediator mediator);
public abstract void Send();
}
(三) 寄信人
public class People : Person
{
public User Sender
{
get;
set;
}
public User Receiver
{
get;
set;
}
public override void SetMediator(Mediator mediator)
{
_mediator= mediator;
}
public override void Send()
{
_mediator.Send(Sender, Receiver);
}
}
(四) 中介者抽象
public abstract class Mediator
{
public abstract void Send(User sender, User receiver);
}
(五) 本地邮局(中介者实现)
public class Postoffice : Mediator
{
public override void Send(User sender, User receiver)
{
Console.WriteLine(sender.Name+"向住在" +
receiver.Address + "的" + receiver.Name + "寄了一封信!"
+ "邮编是" + receiver.PostCode);
}
}
(六) 测试
public void TestMediator()
{
Postoffice post = new Postoffice();
People z1 = new People();
z1.SetMediator(post);
User _zhao = new User { Name = "赵大宝", Address = "东北某地", PostCode = "1212121" };
User _wang = new User { Name = "王英", Address = "山东梁山泊", PostCode = "3636363" };
z1.Sender = _zhao;
z1.Receiver = _wang;
z1.Send();
}
东北的赵大宝向山东的王英寄了一封信……
结果:
赵大宝向住在山东梁山泊的王英寄了一封信!邮编是3636363
在软件构建过程中,经常会出现多个对象互相关联交互的情况,对象之间常常会维持一种复杂的引用关系,如果遇到一些需求的更改,这种直接的引用关系将面临不断的变化。
在这种情况下,我们可使用一个“中介对象”来管理对象间的关联关系,避免相互交互的对象之间的紧耦合引用关系,从而更好地抵御变化。
用一个中介对象来封装一系列对象交互。中介者使各对象不需要相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。《设计模式》GOF
要点:
1,将多个对象间复杂的关联关系解耦,Mediator模式将多个对象间的控制逻辑进行集中管理,变“多个对象互相关系”为多“个对象和一个中介者关联”,简化了系统的维护,抵御了可能的变化。
2,随着控制逻辑的复杂化,Mediator具体对象的实现可能相当复杂。 这时候可以对Mediator对象进行分解处理。
3,Facade模式是解耦系统外到系统内(单向)的对象关系关系;Mediator模式是解耦系统内各个对象之间(双向)的关联关系。
众多的对象间相互关联,相互交互,它们之间常维持着一种复杂的引用关系,把关联关系抽象出来,使众多对象间的相互关联相互交互转为众多对象与中间人关联,做为中转站。在这个例子中,人与人之间的信件往来是多多关联的,且每个人执行各自的信件往来功能(我猜想最早的信件往来是以人带捎的形式实现的,不会自己写的信,自己送吧。而这一具体的事物在一开始便是这种模式的最好体现)。
信件往来中有3个对象:送信的,收信的,邮局。邮局来实现关联对象的功能:寄,收。