设计模式: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
相关推荐
春风十里不如你95273 小时前
【设计模式】【结构型模式(Structural Patterns)】之桥接模式(Bridge Pattern
设计模式·桥接模式
chyun20115 小时前
代码精简之路-责任链模式
java·设计模式
小白不太白9508 小时前
设计模式之 访问者模式
java·设计模式·访问者模式
前端拾光者9 小时前
前端开发设计模式——外观模式
设计模式·外观模式
捕鲸叉17 小时前
C++设计模式之组合模式中适用缓存机制提高遍历与查找速度
c++·设计模式·组合模式
夏旭泽18 小时前
设计模式-工厂模式
设计模式·简单工厂模式
渊渟岳18 小时前
设计模式--原型模式及其编程思想
设计模式
春风十里不如你952719 小时前
【设计模式】【行为型模式(Behavioral Patterns)】之观察者模式(Observer Pattern)
观察者模式·设计模式
春风十里不如你952719 小时前
【设计模式】【创建型模式(Creational Patterns)】之建造者模式(Builder Pattern)
设计模式·建造者模式