1.中介者模式
中介者模式(Mediator Pattern)定义:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式又称为调停者模式,它是一种对象行为型模式。
在面向对象的软件设计与开发过程中,根据“单一职责原则”,我们应该尽量将对象细化,使其只负责或呈现单一的职责。
对于一个模块,可能由很多对象构成,而且这些对象之间可能存在相互的引用,为了减少对象两两之间复杂的引用关系,使之成为一个松耦合的系统,我们需要使用中介者模式,这就是中介者模式的模式动机。
中介者模式包含如下角色: - Mediator: 抽象中介者 - ConcreteMediator: 具体中介者 - Colleague: 抽象同事类 - ConcreteColleague: 具体同事类
2.实例
某论坛系统欲增加一个虚拟聊天室,允许论坛会员通过该聊天室进行信息交流,普通会员(CommonMember)可以给其他会员发送文本信息,钻石会员(DiamondMember)既可以给其他会员发送文本信息,还可以发送图片信息,也可以接收其它会员发来的信息和图片。该聊天室可以对不雅字符进行过滤,如“日”等字符;还可以对发送的图片大小进行控制。用中介者模式设计该虚拟聊天室。
项目结构图如下:


设计抽象聊天室类
public abstract class AbstractChatroom {
public abstract void register(Member member);
public abstract void sendText(String from,String to,String message);
public abstract void sendImage(String from,String to,String message);
}
聊天室组类
public class ChatGroup extends AbstractChatroom {
private Hashtable<String,Member> members=new Hashtable<String,Member>();
@Override
public void register(Member member) {
if(!members.contains(member)){
members.put(member.getName(),member);
member.setChatroom(this);
}
}
@Override
public void sendText(String from, String to, String message) {
Member member=members.get(to);
String newMessage=message;
newMessage=message.replace("日","*");
member.receiveText(from, newMessage);
}
@Override
public void sendImage(String from, String to, String image) {
Member member=members.get(to);
//模拟图片大小判断
if(image.length()>5){
System.out.println("图片太大,发送失败!");
}else{
member.receiveImage(from, image);
}
}
}
设计会员类
public abstract class Member {
protected AbstractChatroom chatroom;
protected String name;
public Member(String name) {
this.name = name;
}
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;
}
public abstract void sendText(String to,String message);
public abstract void sendImage(String to,String image);
public void receiveText(String from,String message){
System.out.println(from+"发送文本给"+this.name+",内容为:"+message);
}
public void receiveImage(String from,String image){
System.out.println(from+"发送图片给"+this.name+",内容为:"+image);
}
}
普通会员类
public class CommonMember extends Member {
public CommonMember(String name) {
super(name);
}
@Override
public void sendText(String to, String message) {
System.out.println("普通会员发送消息:");
chatroom.sendText(this.name, to, message);//发送消息
}
@Override
public void sendImage(String to, String image) {
System.out.println("普通会员不能发送图片!");
}
}
钻石会员类
public class DiamondMember extends Member {
public DiamondMember(String name) {
super(name);
}
@Override
public void sendText(String to, String message) {
System.out.println("钻石会员发送消息:");
chatroom.sendText(this.name, to, message);//发送消息
}
@Override
public void sendImage(String to, String image) {
System.out.println("钻石会员发送图片:");
chatroom.sendImage(this.name, to, image);
}
}
测试类
public class MediatorDemo01 {
public static void main(String[] args) {
AbstractChatroom happyChat=new ChatGroup();
Member member1,member2,member3,member4,member5;
member1=new DiamondMember("钻石会员张三");
member2=new DiamondMember("钻石会员李四");
member3=new CommonMember("普通会员王五");
member4=new CommonMember("普通会员小芳");
member5=new CommonMember("普通会员小红");
happyChat.register(member1);
happyChat.register(member2);
happyChat.register(member3);
happyChat.register(member4);
happyChat.register(member5);
member1.sendText(member2.getName(), member2.getName()+",你好!");
member2.sendText(member1.getName(), member1.getName()+",你好!");
member1.sendText(member2.getName(), "今天天气不错,有日!");
member2.sendText(member1.getName(), "一个很大很大的太阳!");
member2.sendImage(member1.getName(), "太阳");
member3.sendText(member4.getName(), "还有问题吗?");
member3.sendText(member5.getName(), "还有问题吗?");
member4.sendText(member3.getName(), "没有了,谢谢!");
member5.sendText(member3.getName(), "我也没有了!");
member5.sendText(member3.getName(), "谢谢!");
}
}
运行结果:
钻石会员发送消息:
钻石会员张三发送文本给钻石会员李四,内容为:钻石会员李四,你好!
钻石会员发送消息:
钻石会员李四发送文本给钻石会员张三,内容为:钻石会员张三,你好!
钻石会员发送消息:
钻石会员张三发送文本给钻石会员李四,内容为:今天天气不错,有*!
钻石会员发送消息:
钻石会员李四发送文本给钻石会员张三,内容为:一个很大很大的太阳!
钻石会员发送图片:
钻石会员李四发送图片给钻石会员张三,内容为:太阳
普通会员发送消息:
普通会员王五发送文本给普通会员小芳,内容为:还有问题吗?
普通会员发送消息:
普通会员王五发送文本给普通会员小红,内容为:还有问题吗?
普通会员发送消息:
普通会员小芳发送文本给普通会员王五,内容为:没有了,谢谢!
普通会员发送消息:
普通会员小红发送文本给普通会员王五,内容为:我也没有了!
普通会员发送消息:
普通会员小红发送文本给普通会员王五,内容为:谢谢!