设计模式: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
相关推荐
Seven975 小时前
【设计模式】掌握建造者模式:如何优雅地解决复杂对象创建难题?
java·后端·设计模式
yyueshen7 小时前
单例模式,有必要用volatile么?
java·单例模式·设计模式
千益7 小时前
玩转python:系统设计模式在Python项目中的应用
python·设计模式
木胭脂沾染了灰8 小时前
策略设计模式-下单
java·前端·设计模式
Forget the Dream10 小时前
设计模式之迭代器模式
java·c++·设计模式·迭代器模式
周努力.10 小时前
设计模式之单例模式
单例模式·设计模式
大丈夫在世当日食一鲲10 小时前
Java中用到的设计模式
java·开发语言·设计模式
怪力乌龟11 小时前
go语言设计模式-适配器模式
设计模式·golang·适配器模式
木卯12 小时前
5种创建型设计模式笔记(Python实现)
python·设计模式
JinSo17 小时前
国际化探索:颗粒化方案
前端·javascript·设计模式