还是把这张概总图放这里。
对于中介者,任谁一听都想到了房产中介~~哈哈。
是的!房产中介的职责和这个中介者模式的职责很类似,就是在买房和卖房之间建立一个桥梁通讯(当然了,我们这个不收费O(∩_∩)O)
中介者模式的意图中介者使各个对象之间不需要显示的相互引用,而是通过一个比较特殊的中介对象使得程序组件间进行通讯,以此来实现减少程序组件之间的耦合。
让我们来想一想,没有房产中介的情况下,房东们是怎么出租房子的。
话说这里有六个房东需要出租房屋,房屋各不相同、各有各的特点、适合不一样的人租住。这六个房东之间刚好有点联系。然后都在出租房屋。
这时租客A来租房,看了一号房东的房子不满意、但是一号房东觉得可以让他去看看其他五个朋友的房间。然后开始联系他的五个朋友。这样运行下去好像有是没有什么问题的。
但这里有一个情况:当任一房东的房子租出去或不想外租的时候,需要通知其他5个房东,告诉他们不用再给自己介绍租客了。
这里的情形是:一个人发生了变化,需要通知其他五个人
如果我们把6个房东都看做一个对象的话,每个对象(每个房东)都需要维护其他5位的状态。假设房东一的房子出租出去了,那其他5个房东都需要在自己的朋友列表中进行修改--记录房东一的房子已出租,不用给他介绍租客了。
同样,哪一天房东一又像继续出租房子了,其他5位也需要修改--房东一的房子又可以出租了,可以给他介绍租客了。
者还只是一个房东在变化,要是多个房东都在变化,一会儿出租,一会儿不出租~~ 呜呜~~这太烦人啦
于是乎!中介出现啦~
六个房东都把房屋交给中介处理。假如房东二的房子已经出租了,那只需要告诉中介,再来租客的时候,不用带租客来看房东二的房子了。咦~是不是发现只需要通知中介就可以啦~
有中介前:需要通知其他5个房东,5个房东还得都做记录修改。
多对多的关系,牵一发动全身!
有中介后:只需要通知中介一个人,中介自己做好记录修改即可。
一对多的关系,一个变动只和中介发生关系,不影响其他!
现在,大家再来理解中介者模式,是不是要简单些呢?
这里,我们模拟3个房东。他们分别出租一个单间、两居室和三居室。
先来定一个房东的抽象类。
public abstract class Renter {
// 房东通知中介房屋情况
public abstract void sendNotice(String msg);
}
房东和中介有联系,因此我们需要在房东类中维护一个中介对象。先创建一个中介类。
public abstract class Mediator {
// 中介需要通知其他房东
public abstract void notice(String msg, Renter msgFromRenter);
}
现在,回头把房东的抽象类完善下。
public abstract class Renter {
Mediator mediator;
public Renter(Mediator mediator) {
this.mediator = mediator;
}
// 房东通知中介房屋情况
public abstract void sendNotice(String msg);
// 房东收到消息
public abstract void getNotice(String message);
}
实现具体的三个房东。
public class SeparateRoomRenter {
public SeparateRoomRenter(Mediator mediator) {
super(mediator);
}
// 房东通知中介房屋情况
public abstract void sendNotice(String msg) {
this.mediator.notice(msg, this);
};
public abstract void getNotice(String message) {
System.out.println("单间房东收到消息:" + message);
}
}
public class TwoRoomRenter {
public TwoRoomRenter(Mediator mediator) {
super(mediator);
}
// 房东通知中介房屋情况
public abstract void sendNotice(String msg) {
this.mediator.notice(msg, this);
};
public abstract void getNotice(String message) {
System.out.println("两居室房东收到消息:" + message);
}
}
public class ThreeRoomRenter {
public ThreeRoomRenter(Mediator mediator) {
super(mediator);
}
// 房东通知中介房屋情况
public abstract void sendNotice(String msg) {
this.mediator.notice(msg, this);
};
public abstract void getNotice(String message) {
System.out.println("三居室房东收到消息:" + message);
}
}
实现具体的房屋中介。
public class HouseMediator extend Mediator {
SeparateRoomRenter separateRoomRenter;
TwoRoomRenter twoRoomRenter;
ThreeRoomRenter threeRoomRenter;
// 省略getter和setter
public abstract void notice(String msg, Renter msgFromRenter) {
if(msgFromRenter == separateRoomRenter) {
twoRoomRenter.getNotice(msg);
threeRoomRenter.getNotice(msg);
}else if(msgFromRenter == twoRoomRenter) {
separateRoomRenter.getNotice(msg);
threeRoomRenter.getNotice(msg);
}else{
separateRoomRenter.getNotice(msg);
twoRoomRenter.getNotice(msg);
}
}
}
来测试下。
public class MediatorTest {
publid static void main(String[] args) {
// 中介
Mediator houseMediator = new HouseMediator();
// 房东
SeparateRoomRenter separateRoomRenter = new SeparateRoomRenter(houseMediator);
TwoRoomRenter twoRoomRenter = new TwoRoomRenter(houseMediator);
ThreeRoomRenter threeRoomRenter = new ThreeRoomRenter(houseMediator);
// 中介维护所有房东
houseMediator.setSeparateRoomRenter(separateRoomRenter);
houseMediator.setTwoRoomRenter(twoRoomRenter);
houseMediator.setThreeRoomRenter(threeRoomRenter);
// 现在假设单间房的房东确认租客入住了。就只需通知中介。
separateRoomRenter.sendNotice("单间租户已入住!");
}
}
输出:两居室房东收到消息:单间租户已入住!三居室房东收到消息:单间租户已入住!
单间房东之和中介打交道。中介把消息传递给其他房东!重点是:房东之间不在杂乱的相互传递消息,通过中介来处理消息。
中介模式剥离了对象之间的直接通讯,通过中介对象来协作。
具体来说,中介者模式的意图就在于:减少对象之间的混乱关系(那些让人分不清的多对多的关系),通过中介者进行统一管理这些对象,将对象之间的交互封装在中介者的对象里面。
使用场景
优点
缺点 如果各个同事间的交互非常多并且复杂情况下,都交给中介者会导致中介者变得十分复杂,不易维护和管理。 但这点复杂度,相对“多对多”关系的维护来说,简单太多啦~