中介者模式:
用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以控制各个对象的交互。
优点集中控制,缺点也是他,可能导致集中控制的那个中介类代码量编程巨无霸;
using System;
using System.Collections.Generic;
using System.Text;
namespace 设计模式
{
abstract class Mediator
{
public abstract void Send(string message, string receiver_name, Colleague colleagueWhoSend);
}
abstract class Colleague
{
private readonly string name;
public string Getname() { return name; }
protected Mediator mediator;
public Colleague(Mediator mediator,string name)
{
this.mediator = mediator;
this.name = name;
}
public abstract void Send(string message, string receiver_name);
public abstract void Receive(string message, Colleague colleagueWhoSend);
}
//具体实现同事类
class ConcreteColleague : Colleague
{
public void OwnFunction() { }
public ConcreteColleague(Mediator mediator,string name) : base(mediator,name) { }
public override void Send(string message,string receiver_name)
{
mediator.Send(message, receiver_name, this);
}
public override void Receive(string message,Colleague colleagueWhoSend)
{
Console.WriteLine("{0}收到来自{1}的信息{2}", this.Getname(), colleagueWhoSend.Getname(), message);
}
}
//具体实现中介者类
class ConcreteMediator : Mediator
{
private IList<Colleague> colleagues = new List<Colleague>();
public void AddColle(Colleague colleague)
{
colleagues.Add(colleague);
}
public override void Send(string message, string receiver_name, Colleague colleagueWhoSend)
{
bool boo = false;
foreach (Colleague colle in colleagues)
{
if (colle.Getname()== receiver_name)
{
colle.Receive(message, colleagueWhoSend);
boo = true;
}
}
if (boo == false)
{
Console.WriteLine("no such one");
}
}
}
class Costume
{
//客户端程序
static void Main(string[] args)
{
ConcreteMediator Mediator0 = new ConcreteMediator();
ConcreteColleague colleague1 = new ConcreteColleague(Mediator0, "小陈");
ConcreteColleague colleague2 = new ConcreteColleague(Mediator0, "小李");
ConcreteColleague colleague3 = new ConcreteColleague(Mediator0, "小林");
//中介者需要认识所有对象
Mediator0.AddColle(colleague1);
Mediator0.AddColle(colleague2);
Mediator0.AddColle(colleague3);
//对象之间对话,只需要认识通话对象的名字(name)和中介者。
colleague1.Send("你好啊,小林", "小林");
colleague2.Send("你好呀,小林", "小林");
colleague3.Send("你好啊,小陈", "小陈");
colleague3.Send("你好啊,小李", "小李");
colleague1.Send("你好啊,小王", "小王");
}
}
}
结果
小林收到来自小陈的信息你好啊,小林
小林收到来自小李的信息你好呀,小林
小陈收到来自小林的信息你好啊,小陈
小李收到来自小林的信息你好啊,小李
no such one