中介者模式又称调停者模式,属行为模式。
用一个中介者来封装多个对象之间负责的交互行为,中介者对象使各交互对象之间不需显示的声明相互引用,从而使对象之间松耦合,而且可以独立的改变他们之间的交互行为。
角色分析:
Mediator(抽象中介者):
定义同事类之间的通讯接口。
ConcreteMediator(具体中介者):
实现同事类之间的通讯接口,并维护它对各个同事类的引用。
Colleague(抽象同事类):
定义同事类的公共方法
ConcreteColleague(具体同事类):
具体同事类为抽象同事类的子类,每一个同事类都会引用一个中介者对象,同事类之间的通讯,先告知中介者,由中介者完成通讯过程。
使用场景:
1、多个对象之间存现相互的引用。
2、一个对象对多个对象之间有通信,可将通信行为放入中介者,从而将那个对象独立出来。
例:网上简易聊天室
package mediator; /** *create by datao.wang 2014-2-10-上午10:40:32 *抽象中介者 聊天房间 */ public abstract class AbstractChatroom { //注册成员 public abstract void regiser(Member member); //发送消息 public abstract void sendText(String from,String to,String message); } package mediator; import java.util.HashMap; import java.util.Map; /** *create by datao.wang 2014-2-10-上午10:45:57 *具体中介者 */ public class Chatroom extends AbstractChatroom { //引用同事对象 private Map<String,Member> map=new HashMap<String,Member>(); @Override public void regiser(Member member) { if(map.get(member.getName())==null){ map.put(member.getName(),member); } } @Override public void sendText(String from,String to,String message) { Member member=map.get(to); if(member!=null){ member.receiveMessage(from,message); } } } package mediator; /** *create by datao.wang 2014-2-10-上午10:48:58 * 抽象同事角色 */ public abstract class Member { //对中介者的引用 public AbstractChatroom chatroom; public String name; public abstract void receiveMessage(String from,String message); public abstract void sendMessage(String to,String message); public AbstractChatroom getChatroom() { return chatroom; } public void setChatroom(AbstractChatroom chatroom) { this.chatroom = chatroom; } public String getName() { return name; } public void setName(String name) { this.name = name; } } package mediator; /** *create by datao.wang 2014-2-10-上午11:11:12 *具体同事角色 */ public class ConcreteMember extends Member { public ConcreteMember(String name){ this.name=name; } @Override public void receiveMessage(String from, String message) { System.out.println(message+"----------------------"); } @Override public void sendMessage(String to, String message) { this.chatroom.sendText(this.getName(), to, message); } }