重学设计模式(三设计模式-中介者模式)

Posted 穆瑾轩

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了重学设计模式(三设计模式-中介者模式)相关的知识,希望对你有一定的参考价值。

1、中介者模式

    对于中介,大家平时听得最多的莫过于房产中介,房产中介的职责很简单,就是在买房和卖房之间建立一种桥梁沟通两者,这就是我们今天要学习的中介者模式。

1.1、什么是中介者模式

  • 定义

    中介者模式又叫调停模式,是一种行为设计模式,中介者使各个对象不需要显示的相互引用,而是通过一个特殊的中介者对象使程序组件间接通信,从而减少程序组件之间的耦合,它是迪米特法则的典型应用。

    该模式限制了对象之间的直接通信,并迫使它们仅通过中介对象进行协作,类似于MVC模式中的 Controller 部分,控制器(C)就是模型(M)和视图(V)的中介者。

中介者模式的结构:

    1)抽象中介者(Mediator)角色:它是中介者的接口,提供了同事对象注册与转发同事对象信息的抽象方法。

    2)具体中介者(Concrete Mediator)角色:实现中介者接口,定义一个 List 来管理同事对象,协调各个同事角色之间的交互关系,因此它依赖于同事角色。

    3)抽象同事类(Colleague)角色:定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能。

    4)具体同事类(Concrete Colleague)角色:是抽象同事类的实现者,当需要与其他同事对象交互时,由中介者对象负责后续的交互。

    中介者模式的意图在于:减少对象之间的混乱关系(大量多对多的关系)时,通过中介者统一管理这些对象,将对象之间的交互封装在中介者的对象中,从而减少对象间的耦合。

1.2、中介者模式的优缺点

  • 优点

    1)符合单一职责原则,将各组件之间的通信提取到一个地方,减少了各组件间的耦合,使其更易于理解和维护;

    2)符合开闭原则,当引入新的中介者,无须更改原有组件。

  • 缺点

    中介者将原本多个对象间的相互依赖变成了中介者和多个同事间的依赖关系,当同事类越来越多时,中介者本身就会变得复杂而臃肿。

1.3、创建方式

    以小明通过中介来租房子为例。

1)抽象中介者(Mediator)角色

//抽象中介者
public interface Mediator 

	void register(String name,HouseOwner owner); //注册同事对象,房主在中介登记了信息
	
	void forwardMessage(HouseOwner owner,int price); //转发同事信息,与同事对象交互信息的方法

2)具体中介者(Concrete Mediator)角色

//具体中介者
public class ConcreteMediator implements Mediator

	//管理同事对象
	private HashMap<String,HouseOwner> houseowner = new HashMap<String, HouseOwner>();
	
	@Override
	public void register(String name, HouseOwner owner) 
		houseowner.put(name, owner);
	
	
	@Override
	public void forwardMessage(HouseOwner owner,int price)  
		if(owner.sendMessage(price))
			System.out.println("成功租出");
		else
			System.out.println("还是看看其他的吧");
		
	

3)抽象同事类(Colleague)角色

//抽象同事类
public abstract class HouseOwner 

	private Mediator mediator; //聚合,中介者
	
	public HouseOwner(Mediator mediator)
		this.mediator = mediator;
	

	public Mediator getMediator() 
		return mediator;
	
	
	public abstract boolean sendMessage(int price);

4)具体同事类(Concrete Colleague)角色

//具体同事类,也就是具体的房主A
public class HouseAColleague extends HouseOwner

	public HouseAColleague(Mediator mediator) 
		super(mediator);
		this.getMediator().register("HouseA", this);
	

	@Override
	public boolean sendMessage(int price) 
		if(price>=900)
			return true;
		
		System.out.println("我的房子最少租900块");
		return false;
	



//具体同事类,也就是具体的房主B
public class HouseBColleague extends HouseOwner

	public HouseBColleague(Mediator mediator) 
		super(mediator);
		this.getMediator().register("HouseB", this);
	

	@Override
	public boolean sendMessage(int price) 
		if(price>=1500)
			return true;
		
		System.out.println("我的房子最少租1500块");
		return false;
	

 5)客户端

public class Client 

	public static void main(String[] args) 
		//创建中介者
		Mediator mediator = new ConcreteMediator();
		
		//中介带顾客看房子A
		HouseOwner houseA = new HouseAColleague(mediator);
		//房东说
		houseA.sendMessage(900);
		//顾客A只愿意出800
		mediator.forwardMessage(houseA,800);
		
		
		//中介带顾客看房子B
		HouseOwner houseB = new HouseBColleague(mediator);
		//房东说
		houseB.sendMessage(1500);
		//顾客A愿意1500租
		mediator.forwardMessage(houseB,1500);
		
	

案例效果:

此时的UML图:

    客户通过中介租房子,中介跟具体的房东打交道。

1.4、总结及建议

    中介者模式的主要目的就是消除一组系统组件之间的相互依赖关系,而变成依赖于单个中介对象,它集中了系统组件之间的通信,组件只知道中介对象,而很难直接与真正的组件(房东)通信。

应用场景:

    1)许多对象以复杂的方式交互时的依赖关系使得系统难以理解和维护时,可以使用中介者模式;

    2)一个对象引用其他很多对象,导致难以复用该对象时,可以使用中介者模式。

JDK中中介者模式的应用:

    java.util.Timer

    java.util.concurrent.Executor#execute()

    java.lang.reflect.Method#invoke()

以上是关于重学设计模式(三设计模式-中介者模式)的主要内容,如果未能解决你的问题,请参考以下文章

重学设计模式(三设计模式-单例模式)

设计模式代理模式 ( 简介 | 适用场景 | 优缺点 | 代理扩展 | 相关设计模式 )

设计模式之中介模式

中介模式C++实现

重学设计模式(三设计模式-代理模式)

设计模式——租房子中的中介者模式