C# 中介者模式(Mediator)
理解:通过一个中介类,把所有对象都关联中介类,对象间要相互联系时,实际上是通过中介联系,这样对象间仍然是低耦合。
代码:
using System.Windows.Forms;
namespace DesignMode.Mediator
{
//抽象中介类
public abstract class ContactWay
{
public abstract void SendMsg(string msg,Person person);
}
//抽象对象类
public abstract class Person
{
protected ContactWay _way;
public Person(ContactWay way)
{
this._way = way;
}
}
//具体对象1
public class Zhang3 : Person
{
public Zhang3(ContactWay way)
: base(way)
{ }
//重点。发送时实际是通过中介者发送
public void SendMsg(string msg)
{
_way.SendMsg(msg, this);
}
public void GetMsg(string msg)
{
MessageBox.Show("张三得到信息:" + msg);
}
}
//具体对象2
public class Li4 : Person
{
public Li4(ContactWay way)
: base(way)
{ }
//重点。发送时实际是通过中介者发送
public void SendMsg(string msg)
{
_way.SendMsg(msg, this);
}
public void GetMsg(string msg)
{
MessageBox.Show("李四得到信息:" + msg);
}
}
//具体对象3
public class Wang5 : Person
{
public Wang5(ContactWay way)
: base(way)
{ }
//重点。发送时实际是通过中介者发送
public void SendMsg(string msg)
{
_way.SendMsg(msg, this);
}
public void GetMsg(string msg)
{
MessageBox.Show("王五得到信息:" + msg);
}
}
//具体中介类
public class Facebook : ContactWay
{
//中介类需要知道所有的联系对象
private Zhang3 _zhang3;
public Zhang3 zhang3
{
get { return _zhang3; }
set { _zhang3 = value; }
}
private Li4 _li4;
public Li4 li4
{
get { return _li4; }
set { _li4 = value; }
}
private Wang5 _wang5;
public Wang5 wang5
{
get { return _wang5; }
set { _wang5 = value; }
}
public override void SendMsg(string msg, Person person)
{
//把消息转发给其它人
if (person == zhang3)
{
li4.GetMsg(msg);
wang5.GetMsg(msg);
}
else if (person == li4)
{
zhang3.GetMsg(msg);
wang5.GetMsg(msg);
}
else if (person == wang5)
{
zhang3.GetMsg(msg);
li4.GetMsg(msg);
}
}
}
}
namespace DesignMode.Mediator
{
//抽象中介类
public abstract class ContactWay
{
public abstract void SendMsg(string msg,Person person);
}
//抽象对象类
public abstract class Person
{
protected ContactWay _way;
public Person(ContactWay way)
{
this._way = way;
}
}
//具体对象1
public class Zhang3 : Person
{
public Zhang3(ContactWay way)
: base(way)
{ }
//重点。发送时实际是通过中介者发送
public void SendMsg(string msg)
{
_way.SendMsg(msg, this);
}
public void GetMsg(string msg)
{
MessageBox.Show("张三得到信息:" + msg);
}
}
//具体对象2
public class Li4 : Person
{
public Li4(ContactWay way)
: base(way)
{ }
//重点。发送时实际是通过中介者发送
public void SendMsg(string msg)
{
_way.SendMsg(msg, this);
}
public void GetMsg(string msg)
{
MessageBox.Show("李四得到信息:" + msg);
}
}
//具体对象3
public class Wang5 : Person
{
public Wang5(ContactWay way)
: base(way)
{ }
//重点。发送时实际是通过中介者发送
public void SendMsg(string msg)
{
_way.SendMsg(msg, this);
}
public void GetMsg(string msg)
{
MessageBox.Show("王五得到信息:" + msg);
}
}
//具体中介类
public class Facebook : ContactWay
{
//中介类需要知道所有的联系对象
private Zhang3 _zhang3;
public Zhang3 zhang3
{
get { return _zhang3; }
set { _zhang3 = value; }
}
private Li4 _li4;
public Li4 li4
{
get { return _li4; }
set { _li4 = value; }
}
private Wang5 _wang5;
public Wang5 wang5
{
get { return _wang5; }
set { _wang5 = value; }
}
public override void SendMsg(string msg, Person person)
{
//把消息转发给其它人
if (person == zhang3)
{
li4.GetMsg(msg);
wang5.GetMsg(msg);
}
else if (person == li4)
{
zhang3.GetMsg(msg);
wang5.GetMsg(msg);
}
else if (person == wang5)
{
zhang3.GetMsg(msg);
li4.GetMsg(msg);
}
}
}
}
客户端代码:
private void btn_Mediator_Click(object sender, EventArgs e)
{
Facebook facebook = new Facebook();
//让联系人认识中介类
Zhang3 z3 = new Zhang3(facebook);
Li4 l4 = new Li4(facebook);
Wang5 w5 = new Wang5(facebook);
//让中介类认识每个联系人
facebook.zhang3 = z3;
facebook.li4 = l4;
facebook.wang5 = w5;
z3.SendMsg("哥子些,都出来山,闷起咋子");
l4.SendMsg("三哥,最近在哪混哦,看斗五娃儿没?");
w5.SendMsg("日,我一直都在诶,只不过都在潜水,嘿嘿。");
}
{
Facebook facebook = new Facebook();
//让联系人认识中介类
Zhang3 z3 = new Zhang3(facebook);
Li4 l4 = new Li4(facebook);
Wang5 w5 = new Wang5(facebook);
//让中介类认识每个联系人
facebook.zhang3 = z3;
facebook.li4 = l4;
facebook.wang5 = w5;
z3.SendMsg("哥子些,都出来山,闷起咋子");
l4.SendMsg("三哥,最近在哪混哦,看斗五娃儿没?");
w5.SendMsg("日,我一直都在诶,只不过都在潜水,嘿嘿。");
}