目录
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