首页 > 代码库 > JAVA设计模式之 中介者模式【Mediator Pattern】

JAVA设计模式之 中介者模式【Mediator Pattern】

一、概述

    用一个中介对象(中介者)来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式又称为调停者模式,它是一种对象行为型模式。


二、适用场景

    协调多个对象之间的交互。


三、UML类图


四、参与者

1、Mediator(抽象中介者):它定义一个接口,该接口用于与各同事对象之间进行通信。

2、ConcreteMediator(具体中介者):它是抽象中介者的子类,通过协调各个同事对象来实现协作行为,它维持了对各个同事对象的引用。

3、Colleague(抽象同事类):它定义各个同事类公有的方法,并声明了一些抽象方法来供子类实现,同时它维持了一个对抽象中介者类的引用,其子类可以通过该引用来与中介者通信。

4、ConcreteColleague(具体同事类):它是抽象同事类的子类;每一个同事对象在需要和其他同事对象通信时,先与中介者通信,通过中介者来间接完成与其他同事类的通信;在具体同事类中实现了在抽象同事类中声明的抽象方法。


五、用例学习[用例背景:求租者 - 房屋出租中介 - 房东 的故事]

1、抽象同事类:Person.java

/**
 * 抽象同事类:
 * @author  lvzb.software@qq.com
 *
 */
public abstract class Person {
	// 维持一个抽象中介者的引用
	protected Mediator mediator;
	
	protected String name;
	
	public Person(String name, Mediator mediator){
		this.mediator = mediator;
		this.name = name;
	}
	
	/**
	 * 设置中介者对象
	 * @param mediator
	 */
	public void setMediator(Mediator mediator){
		this.mediator = mediator;
	}

	/**
	 * 向中介 发送消息
	 */
	protected abstract void sendMessage(String msg);
	
	/**
	 * 从中介 获取消息
	 */
	protected abstract void getMessage(String msg);
}
2、房屋求租者 Renter.java

/**
 * 具体同事类:这里的角色是 租房者
 * @author  lvzb.software@qq.com
 *
 */
public class Renter extends Person {

	public Renter(String name, Mediator mediator) {
		super(name, mediator);
	}
	

	@Override
	protected void sendMessage(String msg) {
		mediator.operation(this, msg);
	}

	@Override
	protected void getMessage(String msg) {
		System.out.println("求租者[" + name + "]收到中介发来的消息: " + msg);
	}

}
3、具体同事类 房屋出租者[房东] Landlord.java

/**
 * 具体同事类:这里的角色是 房东
 * @author  lvzb.software@qq.com
 *
 */
public class Landlord extends Person {

	public Landlord(String name, Mediator mediator) {
		super(name,mediator);
	}
	
	@Override
	protected void sendMessage(String msg) {
		mediator.operation(this, msg);
	}

	@Override
	protected void getMessage(String msg) {
		System.out.println("房东["+ name +"]收到中介发来的消息:" + msg);
	}

}
4、抽象中介者类:Mediator.java

/**
 * 抽象中介者类
 * @author  lvzb.software@qq.com
 *
 */
public abstract class Mediator {
	// 用于添加储存 "房东"角色
	protected List<Person> landlordList = new ArrayList<Person>();
	
	// 用于添加储存 "求租者"角色
	protected List<Person> renterList = new ArrayList<Person>();
	
	/**
	 * 中介者注册房东信息
	 * @param landlord 房东实体
	 */
	public void registerLandlord(Person landlord){
		landlordList.add(landlord);
	}
	
	/**
	 * 中介者注册 求租者信息
	 * @param landlord 房东实体
	 */
	public void registerRenter(Person landlord){
		renterList.add(landlord);
	}
	
	
	/**
	 * 声明抽象方法 由具体中介者子类实现 消息的中转和协调
	 */
	public abstract void operation(Person person, String message);

}
5、具体中介者类:房屋中介 HouseMediator.java

/**
 * 具体中介者类:这里的角色是 房屋出租中介
 * @author  lvzb.software@qq.com
 *
 */
public class HouseMediator extends Mediator {

	@Override
	public void operation(Person person, String message) {
		if(person instanceof Renter){
			// 将租屋的需求消息传递给 注册了的房东们
			for(Person landlord: landlordList){
				landlord.getMessage(message);
			}
		} else if(person instanceof Landlord){
			// 将房东的出租房消息传递给 注册了的 房屋求租者们
			for(Person renter : renterList){
				renter.getMessage(message);
			}
		}
		
	}

}
6、客户端测试类 Client.java

/**
 * 客户端测试类
 * @author  lvzb.software@qq.com
 *
 */
public class Client {

	public static void main(String[] args) {
		// 实例化房屋中介
		Mediator mediator = new HouseMediator();
		
		Person landlordA, landlordB, renter;
		landlordA = new Landlord("房东李", mediator);
		landlordB = new Landlord("房东黎", mediator);
				
		renter = new Renter("小吕",mediator);
		
		// 房东注册中介
		mediator.registerLandlord(landlordA);
		mediator.registerLandlord(landlordB);
		// 求租者注册中介
		mediator.registerRenter(renter);
		
		// 求租者 发送求租消息
		renter.sendMessage("在天河公园附近租套房子,价格1000元左右一个月");
		System.out.println("--------------------------");
		// 房东A 发送房屋出租消息
		landlordA.sendMessage("天河公园学院站三巷27号四楼有一房一厅出租  1200/月  光线好 近公交站");
	}

}
7、运行结果:

房东[房东李]收到中介发来的消息:在天河公园附近租套房子,价格1000元左右一个月
房东[房东黎]收到中介发来的消息:在天河公园附近租套房子,价格1000元左右一个月
--------------------------
求租者[小吕]收到中介发来的消息: 天河公园学院站三巷27号四楼有一房一厅出租  1200/月  光线好 近公交站





JAVA设计模式之 中介者模式【Mediator Pattern】