设计模式之中介者模式

        生活中有一个叫做中介公司的存在,有时候确实帮我们省却了不少功夫。比如买房什么的,我们只需要跟说明我们的需求,中介会跟相应的房源联系,这省却了我们盲目地寻找,挨家挨户的看房。这就是中介这个工作存在的好处。其实,这也是我们今天要讲的中介者模式存在的作用。在没有中介者的情况下,所有的对象都需要认识其它对象。也就是说,对象之间是紧耦合的。有了中介之后,对象之间彻底解耦。就像我们有了中介之后,不需要盲目地跑各个楼盘,中介会根据我们的需求筛选出几个合适的楼盘,这省去了我们很多的时间和精力。

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("单身公寓");

	}

}
运行客户端代码,得到如下结果:

来了一位客户,想要采光好的房源
这里是绿城房产,房源采光好,户型种类多
---------------------
又来了一位客户,想要有品质,高端的房源
这里是碧桂园,这里的房源高端大气上档次,是生活品质的象征
---------------------
又来了一位客户,想要一个单身公寓
我再帮您看看有没有其它适合您的房源
        以上便是中介者模式的示例,从中可以发现,两类对象原本毫无关联,但是可以通过中介者模式可以将其进行松耦合关联起来。中介者的核心就是需要根据一类对象传入的信息进行逻辑判断,从而对另一类对象进行相应的操作。





  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值