中介者模式(Mediator)
1.意图
用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
在下列情况下使用中介者模式 :
• 一组对象以定义良好但是复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解。
• 一个对象引用其他很多对象并且直接与这些对象通信 ,导致难以复用该对象。
• 想定制一个分布在多个类中的行为,而又不想生成太多的子类。
2.特点
• Mediator(中介者 )
— 中介者定义一个接口用于与各同事(Colleague)对象通信。
• ConcreteMediator(具体中介者)
— 具体中介者通过协调各同事对象实现协作行为。
— 了解并维护它的各个同事。
• Colleague class(同事类)
— 每一个同事类都知道它的中介者对象。
— 每一个同事对象在需与其他的同事通信的时候,与它的中介者通信。
同事向一个中介者对象发送和接收请求。中介者在各同事间适当地转发请求以实现协作行为。
3.UML类图
4.代码
/**
* Mediator(中介者 )
— 中介者定义一个接口用于与各同事(Colleague)对象通信。
*/
public interface Mediator {
void contact(String message,Colleague coll);
}
/**
* ConcreteMediator(具体中介者)
— 具体中介者通过协调各同事对象实现协作行为。
— 了解并维护它的各个同事。
*/
public class ConcreteMediator implements Mediator {
private List<Colleague> list = new ArrayList<Colleague>();
public void addColleague(Colleague colleague){
list.add(colleague);
}
/**
* 中介者联系具体的同事类.将消息发送给同事类
* @param message
* @param coll
*/
@Override
public void contact(String message, Colleague coll) {
for(Colleague colleague:list){
if(colleague!=coll)
colleague.getMessage(message);
}
}
}
/**
* 抽象同事类
* 每个同事类必须持有自己的中介者.
*/
public abstract class Colleague {
protected String name;
protected Mediator mediator;
public Colleague(String name, Mediator mediator) {
this.name = name;
this.mediator = mediator;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public abstract void getMessage(String message);
public abstract void contact(String message);
}
/**
* Colleague class(同事类)
— 每一个同事类都知道它的中介者对象。
— 每一个同事对象在需与其他的同事通信的时候,与它的中介者通信。
*/
public class ColleagueA extends Colleague {
public ColleagueA(String name, Mediator mediator) {
super(name, mediator);
}
/**
* 得到中介者的消息
* @param message
*/
public void getMessage(String message){
System.out.println("同事-"+name+"收到消息:"+message);
}
/**
* 通过中介者发布消息
* @param message
*/
public void contact(String message){
mediator.contact(message,this);
}
}
public class MediatorTest {
public static void main(String[] args) {
ConcreteMediator mediator = new ConcreteMediator();
Colleague colleaguea = new ColleagueA("A",mediator);
Colleague colleagueb = new ColleagueA("B",mediator);
Colleague colleaguec = new ColleagueA("C",mediator);
mediator.addColleague(colleaguea);
mediator.addColleague(colleagueb);
mediator.addColleague(colleaguec);
colleaguea.contact("吃饭了");
colleagueb.contact("今天吃什么?");
colleaguec.contact("肯德基吧.");
colleaguea.contact("好啊.");
colleagueb.contact("行");
}
}