中介者模式介绍(轰轰烈烈的求职市场演示)
说明:这里只是记录我学习的笔记,谢谢webabcd,完全是学习了乐在其中设计模式(C#) - 中介者模式(Mediator Pattern),然后在写出来的一点东西,原文引用:http://www.cnblogs.com/webabcd/articles/752808.html
介绍
用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。——很多书籍都这样解释,在这里也这样借用一下。
大白话解释:其实就是把大家杂糅在“一堆”的沟通调节成有组织的沟通,找一个中介人,“我”只跟“中介人”沟通,然后让“中介人”代替“我”向“你”(目标用户)传达“我”的话。我们每个人之间不再直接沟通,大家都去找一个中介来传达我们相互之间的意思。
经常听到这样一句话“现在工作不好找啊”,其实,我感觉:从我记事开始起,工作都不怎么好找。特别是在目前经济危机的情况下,好像大家说这句话说的更多了。今天,就围绕“求职”来说说我所理解的设计模式之中介者模式是什么样的东西,其实我自己也郁闷求职,因为深有感触,所以才这样写,在这里引用“面霸”和“阎王”绝对没有任何恶意,调侃而已。
先看看人才市场上“乱哄哄”的“人行(读hang)”景象,两大群体:求职者,也就是我们的“面霸”、“网申”;招聘者,那就是少有的“阎王”了。我们大家都在这“一堆”沟通,相互沟通,挑挑拣拣,讨价还价。

“面霸”—“面霸”的沟通:
“乖!乖!现在工作不好找啊!”
“嗯!是不好找,都是经济危机惹的祸!”
“阎王”—“阎王”的沟通:
“奇怪了,现在的大学生都要求条件,要那么高的工资!”
“是的,应该不给他钱就给我们干活,因为他们刚入社会嘛,要学很多东西。”
“面霸”—“阎王”的沟通:
面霸1:我想申请贵公司的XXX程序员职位。
阎王1:对不起,你经验不够。我们要求3年以上经验的。
阎王2:如果不给你工资,来公司试用3个月,你愿意来吗?毕竟你的经验还不够。
面霸2:我回家考虑考虑吧。
大家都在一窝堆里沟通,多多少少有些“乱”。
说实话,我很佩服那些有经济头脑的人,他们总是能抓住市场机遇,新开辟一个行业,于是在这样的社会背景下就产生了“人才中介”,到街上看看,到处都是“职业介绍所”,我是说去看看,你要做其他的事情,我就不管了。
“人才中介”总是在给我们每一个提供服务,贴身化的服务,搞不好,还给你来一个“XXX个人求职整体策划方案”,他们会告诉你他们有策划部,宣传部,实施部,跟踪部,等等良好的软硬件设施。嘿嘿~~~~
人才中介的职责就是:
1、替“阎王”去找“面霸”;
2、替“面霸”去找“阎王”;
大家在前期不用直接面对面的沟通,都通过人才中介去沟通。至于到后期的什么事,就不是我们今天要说的“中介者模式”了,我们今天只服务到牵引拉线,后面的事就不说了。
看看有了中介后,“一堆乱麻”就“竟然有序”了:

不论是“面霸”还是“阎王”,大家都不互相直接沟通了,都去通过那个“中介”来相互表达各自的意思,是不是更清晰了呢?
理论性的东西就不说了,网上很多老师都讲过,去找找,看他们说的更详细准确。直接上代码看看。
●中介的抽象:

Code
/// <summary>
/// 中介者的抽象
/// </summary>
public abstract class AbstractMediator
{
/// <summary>
/// 注册一个人员类型的对象
/// </summary>
/// <param name="people"></param>
public abstract void Register(AbstractPeople people);
/// <summary>
/// 发送消息
/// </summary>
public abstract string SendMsg(Message msg);
}
●真正的中介者(继承中介的抽象):

Code
/// <summary>
/// 具体中介者
/// </summary>
public class Mediator : AbstractMediator
{
private Dictionary<string, AbstractPeople> mediator = new Dictionary<string, AbstractPeople>();
/// <summary>
/// 注册人员类型的对象
/// </summary>
/// <param name="people"></param>
public override void Register(AbstractPeople people)
{
if (!mediator.ContainsKey(people.MyID))
{
mediator.Add(people.MyID, people);
}
people.A_Mediator = this;
}
/// <summary>
/// 中介者进行消息转发
/// 将用户发送来的消息转发到目标用户
/// </summary>
public override string SendMsg(Message msg)
{
return mediator[msg.FromUID].Receive(msg);
}
}
●人物的抽象:

Code
/// <summary>
/// 关联成员的抽象
/// </summary>
public abstract class AbstractPeople
{
public AbstractPeople(string myid)
{
this._myid = myid;
}
private string _myid;
/// <summary>
/// 个人ID
/// </summary>
public string MyID
{
set { this._myid = value; }
get { return this._myid; }
}
private AbstractMediator _mediator = null;
public AbstractMediator A_Mediator
{
set { this._mediator = value; }
get { return this._mediator; }
}
/// <summary>
/// 发送消息
/// </summary>
public string Send(string myid, Message msg)
{
return A_Mediator.SendMsg(msg);
}
/// <summary>
/// 接收新消息处理,供实现者按自己的方式处理
/// </summary>
public abstract string Receive(Message msg);
}
●具体人物(求职者1):

Code
/// <summary>
/// 求职者1
/// </summary>
public class PeopleJobSeeker1 : AbstractPeople
{
public PeopleJobSeeker1(string myid)
: base(myid)
{ }
/// <summary>
/// 接收到新消息处理,可以按自己的方式处理
/// </summary>
public override string Receive(Message msg)
{
string result = "我" + msg.ToUID + "接到了" + msg.FromUID + "的以下消息:\r\n" + msg.Msg;
return result;
}
}
●具体人物(求职者2):

Code
/// <summary>
/// 求职者2
/// </summary>
class PeopleJobSeeker2 : AbstractPeople
{
public PeopleJobSeeker2(string myid)
: base(myid)
{ }
/// <summary>
/// 接收到新消息处理,可以按自己的方式处理
/// </summary>
public override string Receive(Message msg)
{
string result = "我" + msg.ToUID + "接到了" + msg.FromUID + "的以下消息:\r\n" + msg.Msg;
return result;
}
}
●具体人物(招聘者1):

Code
/// <summary>
/// 招聘者1
/// </summary>
public class PeopleExaminer1:AbstractPeople
{
public PeopleExaminer1(string myid)
: base(myid)
{ }
/// <summary>
/// 接收到新消息处理,可以按自己的方式处理
/// </summary>
public override string Receive(Message msg)
{
string result = "我" + msg.ToUID + "接到了" + msg.FromUID + "的以下消息:\r\n" + msg.Msg;
return result;
}
}
●具体人物(招聘者2):

Code
/// <summary>
/// 招聘者2
/// </summary>
class PeopleExaminer2 : AbstractPeople
{
public PeopleExaminer2(string myid)
: base(myid)
{ }
/// <summary>
/// 接收到新消息处理,可以按自己的方式处理
/// </summary>
public override string Receive(Message msg)
{
string result = "我" + msg.ToUID + "接到了" + msg.FromUID + "的以下消息:\r\n" + msg.Msg;
return result;
}
}
●客户端的调用:

Code
private void mainForm_Load(object sender, EventArgs e)
{
//构造多个关联成员
examiner1 = new PeopleExaminer1("examiner1");
examiner2 = new PeopleExaminer2("examiner2");
jobSeeker1 = new PeopleJobSeeker1("jobSeeker1");
jobSeeker2 = new PeopleJobSeeker2("jobSeeker2");
//向中介者注册关联成员
mediator.Register(examiner1);
mediator.Register(examiner2);
mediator.Register(jobSeeker1);
mediator.Register(jobSeeker2);
}
private void btn_sender_Click(object sender, EventArgs e)
{
//客户调用
txtMsg.AppendText(examiner1.Send("", new Message("examiner1", "jobSeeker1", "examiner1对jobSeeker1说'你好'")));
txtMsg.AppendText("\r\n\r\n"); //换行处理
txtMsg.AppendText(examiner2.Send("", new Message("examiner2", "jobSeeker2", "examiner2对jobSeeker2说'你好'")));
txtMsg.AppendText("\r\n\r\n");
txtMsg.AppendText(jobSeeker1.Send("", new Message("jobSeeker1", "examiner1", "jobSeeker1对examiner1说'你好'")));
txtMsg.AppendText("\r\n\r\n");
txtMsg.AppendText(jobSeeker2.Send("", new Message("jobSeeker2", "examiner2", "jobSeeker2对examiner2说'你好'")));
txtMsg.AppendText("\r\n\r\n");
}
其实中介者那里可以注册N多个求职者或招聘者,只要去提前构造这些对象就可以了。