生活中有一个叫做中介公司的存在,有时候确实帮我们省却了不少功夫。比如买房什么的,我们只需要跟说明我们的需求,中介会跟相应的房源联系,这省却了我们盲目地寻找,挨家挨户的看房。这就是中介这个工作存在的好处。其实,这也是我们今天要讲的中介者模式存在的作用。在没有中介者的情况下,所有的对象都需要认识其它对象。也就是说,对象之间是紧耦合的。有了中介之后,对象之间彻底解耦。就像我们有了中介之后,不需要盲目地跑各个楼盘,中介会根据我们的需求筛选出几个合适的楼盘,这省去了我们很多的时间和精力。
1.适用性和优缺点
1.适用性
a.一组对象以定义良好但是复杂的方式进行通信。产生的相互依赖关系结构混乱难以理解。
b.一个对象引用其它很多对象并且直接与这些对象通信,导致难以复用该对象。
c.想定制一个分布在多个类中的行为,而又不想生成太多的子类。
2.优点a.痛过将对象彼此解耦,可以增加对象的复用性。
b.通过将控制逻辑集中,可以简化系统维护。
c.可以让对象之间所传递的消息变得简单而且大幅减少。
3.缺点如果设计不当,中介者对象本身由于逻辑关系比较多而变得过于复杂。
2.示例讲解。
本文的示例就以房产中介以及房源的例子进行分析。
首先看示例UML图
Mediator:中介接口,统一定义中介类,因为不止有房产中介还有各种中介。统一接口便于后续操作。
HouseMediator:中介接口的实现类,这里进行逻辑判断,将两个没有关系的对象关联在一起。比如客户和房源
House:这里指房源接口。
ConcreteHouse:这里指的是具体房源,本文用了绿城和碧桂园。
从UML图可以看出,中介者有一个notice方法,是用于客户进行通知中介的,告诉中介一些信息,然后中介在notice方法中进行逻辑判断,操作相应的房源对象。接下来我们看看这个例子的具体实现以及代码。
首先定义一个中介抽象类
package mediatorpattern;
public abstract class Mediator {
public abstract void notice(String content);
}
然后是房产中介的实现,房产中介中的notice方法中根据传入的content进行逻辑判断,并操作相应对象。
package mediatorpattern;
public class HouseMediator extends Mediator {
public House lc,bgy;
//初始化
public HouseMediator()
{
lc=new LvCheng();
bgy=new BiGuiYuan();
}
@Override
public void notice(String content) {
// TODO Auto-generated method stub
if(content.equals("采光好"))
lc.action();
else if(content.equals("生活品质"))
bgy.action();
else
System.out.println("我再帮您看看有没有其它适合您的房源");
}
}
接下来是房源接口,统一接口,便于将房源对象传入中介时能够统一接口。
package mediatorpattern;
public abstract class House {
public abstract void action();
}
具体房源的实现
package mediatorpattern;
public class LvCheng extends House {
@Override
public void action() {
// TODO Auto-generated method stub
info();
}
private void info()
{
System.out.println("这里是绿城房产,房源采光好,户型种类多");
}
}
package mediatorpattern;
public class BiGuiYuan extends House {
@Override
public void action() {
// TODO Auto-generated method stub
info();
}
private void info()
{
System.out.println("这里是碧桂园,这里的房源高端大气上档次,是生活品质的象征");
}
}
然后是客户端代码,根据客户需求传入信息给中介,中介会作出相应操作。
package mediatorpattern;
public class CustomorTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
Mediator md=new HouseMediator();
System.out.println("来了一位客户,想要采光好的房源");
md.notice("采光好");
System.out.println("---------------------");
System.out.println("又来了一位客户,想要有品质,高端的房源");
md.notice("生活品质");
System.out.println("---------------------");
System.out.println("又来了一位客户,想要一个单身公寓");
md.notice("单身公寓");
}
}
运行客户端代码,得到如下结果:
来了一位客户,想要采光好的房源
这里是绿城房产,房源采光好,户型种类多
---------------------
又来了一位客户,想要有品质,高端的房源
这里是碧桂园,这里的房源高端大气上档次,是生活品质的象征
---------------------
又来了一位客户,想要一个单身公寓
我再帮您看看有没有其它适合您的房源
以上便是中介者模式的示例,从中可以发现,两类对象原本毫无关联,但是可以通过中介者模式可以将其进行松耦合关联起来。中介者的核心就是需要根据一类对象传入的信息进行逻辑判断,从而对另一类对象进行相应的操作。