设计模式:12、中介者模式

目录

0、定义

1、中介者模式的四种角色

2、中介者模式的UML类图

3、示例代码


0、定义

用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互。

1、中介者模式的四种角色

  • 中介者(Mediator):中介者 是一个接口,该接口定义了用于同事(colleague)对象之间进行通信的方法。
  • 具体中介者(ConcreteMediator):具体中介者 是实现中介者 接口的类。具体中介者 需要包含所有具体同事 (ConcreteColleague)的引用,并通过实现中介者 接口中的方法来满足具体同事之间的通信请求。
  • 同事(Colleague):一个接口,规定了具体同事需要实现的方法。
  • 具体同事(ConcreteColleague):实现同事 接口的类。具体同事 需要包含具体中介者 的引用,一个具体同事 需要和其他具体同事 交互时,只需将自己的请求通知给它所包含的具体中介者即可。

2、中介者模式的UML类图

3、示例代码

同事

java 复制代码
package xyz.jangle.design.mediator;
/**
 * 同事
 * @author Administrator
 *
 */
public interface Colleague {
	/**
	 * 发送消息
	 * @param mess
	 */
	public void giveMess(String mess);
	/**
	 * 接收消息
	 * @param mess
	 */
	public void receiverMess(String mess);

}

中介者

java 复制代码
package xyz.jangle.design.mediator;
/**
 * 中介者
 * @author Administrator
 *
 */
public interface Mediator {
	/**
	 * 注册同事
	 * @param colleague
	 */
	public void registerColleague(Colleague colleague);
	/**
	 * 传递消息
	 * @param colleague
	 * @param mess
	 */
	public void deliverMess(Colleague colleague,String mess);

}

具体中介者

java 复制代码
package xyz.jangle.design.mediator;

import java.util.ArrayList;
import java.util.List;
/**
 * 具体中介者
 * @author Administrator
 *
 */
public class ConcreteMediator implements Mediator{
	List<Colleague> list = new ArrayList<Colleague>();
	
	@Override
	public void registerColleague(Colleague colleague) {
		list.add(colleague);
	}

	@Override
	public void deliverMess(Colleague colleague, String mess) {
		for(Colleague coll:list) {
			if(coll != colleague) {	//排除自己
				coll.receiverMess(mess);
			}
		}
	}
	
	

}

具体同事1

java 复制代码
package xyz.jangle.design.mediator;
/**
 * 具体同事
 * @author Administrator
 *
 */
public class ConcreteColleague1 implements Colleague {
	
	Mediator mediator;

	public ConcreteColleague1(Mediator mediator) {
		super();
		this.mediator = mediator;
		mediator.registerColleague(this);
	}

	@Override
	public void giveMess(String mess) {
		mediator.deliverMess(this, mess);
	}

	@Override
	public void receiverMess(String mess) {
		System.out.println("ConcreteColleague1收到消息:"+mess);
	}
	
	

}

具体同事2

java 复制代码
package xyz.jangle.design.mediator;
/**
 * 具体同事
 * @author Administrator
 *
 */
public class ConcreteColleague2 implements Colleague {
	
	Mediator mediator;

	public ConcreteColleague2(Mediator mediator) {
		super();
		this.mediator = mediator;
		mediator.registerColleague(this);
	}

	@Override
	public void giveMess(String mess) {
		mediator.deliverMess(this, mess);
	}

	@Override
	public void receiverMess(String mess) {
		System.out.println("ConcreteColleague2收到消息:"+mess);
	}

}

客户端(使用)

java 复制代码
package xyz.jangle.design.mediator;

public class AppMain12 {

	public static void main(String[] args) {
		
		Mediator mediator = new ConcreteMediator();	//创建具体中介者
		Colleague colleague1 = new ConcreteColleague1(mediator);	//创建同事1
		Colleague colleague2 = new ConcreteColleague2(mediator);	//创建同事2
		colleague1.giveMess("hello 123");	//同事1发送消息给其他同事
		colleague2.giveMess("hello 321");	//同事2发送消息给其他同事

	}

}

执行结果

bash 复制代码
ConcreteColleague2收到消息:hello 123
ConcreteColleague1收到消息:hello 321
相关推荐
Swift社区2 小时前
AI 时代,ArkUI 的设计模式会改变吗?
人工智能·设计模式
数据中穿行2 小时前
访问者设计模式全方位深度解析
设计模式
宁雨桥3 小时前
前端设计模式面试题大全
前端·设计模式
数据中穿行4 小时前
迭代器设计模式全方位深度解析
设计模式
数据中穿行4 小时前
观察者设计模式全方位深度解析
设计模式
程序员Terry5 小时前
别老写重复代码了!模版方法模式一次讲透
java·设计模式
数据中穿行5 小时前
建造者模式全方位深度解析
设计模式
数据中穿行5 小时前
组合设计模式全方位深度解析
设计模式
数据中穿行5 小时前
原型设计模式全方位深度解析
设计模式
CRMEB6 小时前
电商项目中订单流程可以使用哪些设计模式?如何开发?
java·设计模式·gitee·开源·php·crmeb