Mrs_Hudson想要出租她在Baker 211B的房子,于是她找到了中介公司;而Sherlock想要租一套房子,他也找了相同的中介公司,并且相中了Baker 211B的房子,于是他决定租下它。
在这里,按照面向对象的观点,我们可以抽象出3个对象:the HouseOwner:Mrs_Hudson ;HouseRenter:Sherlock and the Agency.下面,我们来用面向对象的语言来分析下这个过程:
租房子
那么,用面向对象的语言该如何描述这个租房过程呢?如下图:
首先,在房主和租房者之间有一个房产中介,用于传递房主和租房者之间的交流信息。(在图中,委托被画成了一个类的样子,为什么呢?因为你看一些书的时候,书上会说:委托是一个类。具体原因自己百度下吧~)其次,是房主和租房者。
先看房主HouseOwner的代码:
class HouseOwner { private string name; public HouseOwner(string name) {this.name=name;} public delegate void AgencyHandler(); //声明委托AgencyHandler,将来由该委托对象负责通知事件 public event AgencyHandler HouseRent; //声明事件HouseRent,它的事件类型是委托AgencyHandler public void Rent() { Console.WriteLine("{0}要出租房屋",name); if (HouseRent != null) //如果执行Rent方法时,HouseRent中有对象登记事件,则执行HouseRent { HouseRent(); } } }
class HouseRenter { private string name; public HouseRenter(string name) { this.name=name; } public void RentHouse() { Console.WriteLine("{0}要租房子。",name); } }
只要一有合适的房子,租房者就表示要租房子。
那么,房主的Rent事件和租房者的RentHouse事件如何绑定呢?
看主函数代码:
static void Main(string[] args) { HouseOwner Mrs_Hudson=new HouseOwner("Mrs_Hudson"); HouseRenter Sherlock=new HouseRenter("Sherlock"); Mrs_Hudson.HouseRent += new HouseOwner.AgencyHandler(Sherlock.RentHouse); Mrs_Hudson.Rent(); }
其中, Mrs_Hudson.HouseRent += newHouseOwner.AgencyHandler(Sherlock.RentHouse);
将租房者的RentHouse事件,通过实例化委托登记到房东的HouseRent事件当中,当执行Mrs_Hudson.Rent();时,表示房东要出租房子,然后委托通知租房者,租房者表示要租房。
运行结果:
既然要租房子,当然房东和租房者要谈价钱了,这就涉及到了两个类中数据的交流。那么,如何通过委托来实现数据的交流呢?
在.NET框架中,还提供了事件参数基类EventArgs专门用于传递事件数据。
从该EventArgs类派生一个自定义的事件参数类MoneyEventArgs,这个类型将携带具体的房租金额。
此时,我们要增加一个MoneyEventArgs,这个类用于存放房子的租金信息:
class MoneyEventArgs : EventArgs { private string money; public string Money { get { return this.money; } set { this.money = value; } } }
而且,房东类中也要加一个字段,money,并且使用刚才定义的MoneyEventArgs,来传递房租价格这一数据。
如图:
租房者一端,也要做出相应改变:
这里,主要也是定义一个MoneyEventArgs,用来接收房东一端广播式的传送过来的房租金额这一数据。
入口函数变化很小,只是在HouseOwner的构造函数中加上一个金额来实例化对象。
运行之后:
小结:
在租房者和房东这两个类中,它们原本需要传递相互传递数据,来实现租房这一过程,但是现在通过委托这一第三方来实现租房这一过程,减少了两个类的直接接触,实现了低耦合。