设计模式学习笔记——中介者模式
2012-05-10 14:51
429 查看
定义:
用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示的互相交互,从而使其耦合松散,而且可以独立的改变他们之间的交互。
模式动机:
1、在面向对象的软件设计与开发过程中,根据“单一职责原则”,我们应该尽量将对象细化,使其只负责或呈现单一的职责。
2、对于一个模块,可能由很多对象构成,而且这些对象之间可能存在相互的引用,为了减少对象两两之间复杂的引用关系,使之成为一个松耦合的系统,我们需要使用中介者模式,这就是中介者模式的模式动机。
实例分析:虚拟聊天室
某论坛系统欲增加一个虚拟聊天室,允许论坛会员通过该聊天室进行信息交流,普通会员(CommonMember)可以给其他会员发送文本信息,钻石会员(DiamondMember)既可以给其他会员发送文本信息,还可以发送图片信息。
在本例中,聊天室就是中介者的角色,会员之间的沟通都通过中介者,这样就将错综复杂的会员关系,变得有条有理了。
其类图如下:
其实现代码如下:
中介者模式的优点:
1、简化了对象之间的交互。
2、将各同事解耦。
3、减少子类生成。
4、可以简化各同事类的设计和实现。
中介者模式的缺点
在具体中介者类中包含了同事之间的交互细节,可能会导致具体中介者类非常复杂,使得系统难以维护。
用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示的互相交互,从而使其耦合松散,而且可以独立的改变他们之间的交互。
模式动机:
1、在面向对象的软件设计与开发过程中,根据“单一职责原则”,我们应该尽量将对象细化,使其只负责或呈现单一的职责。
2、对于一个模块,可能由很多对象构成,而且这些对象之间可能存在相互的引用,为了减少对象两两之间复杂的引用关系,使之成为一个松耦合的系统,我们需要使用中介者模式,这就是中介者模式的模式动机。
实例分析:虚拟聊天室
某论坛系统欲增加一个虚拟聊天室,允许论坛会员通过该聊天室进行信息交流,普通会员(CommonMember)可以给其他会员发送文本信息,钻石会员(DiamondMember)既可以给其他会员发送文本信息,还可以发送图片信息。
在本例中,聊天室就是中介者的角色,会员之间的沟通都通过中介者,这样就将错综复杂的会员关系,变得有条有理了。
其类图如下:
其实现代码如下:
public abstract class AbstractChatRoom { public abstract void register(Member member); public abstract void sendText(String from, String to, String text); public abstract void sendImage(String from, String to, String image); }
public class ChatRoomGroup extends AbstractChatRoom { private Map<String,Member> members=new HashMap<String,Member>(); @Override public void register(Member member) { if(members.containsKey(member.getName())) System.out.println("已被注册!"); else { this.members.put(member.getName(), member); member.setRoom(this);//要在这里将会员中的ChatRoomGroup设置为本类对象 } } @Override public void sendText(String from, String to, String text) { if(members.containsKey(from) && members.containsKey(to)){ Member mTo=members.get(to); mTo.receiveText(from, text); } } @Override public void sendImage(String from, String to, String image) { if(members.containsKey(from) && members.containsKey(to)){ Member mTo=members.get(to); mTo.receiveImage(from, image); } } }
public abstract class Member { protected String name; protected AbstractChatRoom room; public Member(String name){ this.name=name; } public String getName() { return name; } public void setName(String name) { this.name = name; } public AbstractChatRoom getRoom() { return room; } public void setRoom(AbstractChatRoom room) { this.room = room; } public abstract void sendText(String to, String text); public abstract void sendImage(String to, String image); public void receiveText(String from , String text){ System.out.println(this.name+" receive text from "+from+": "+text); } public void receiveImage(String from , String image){ System.out.println(this.name+" receive image from "+from+": "+image); } }
/* * 钻石会员可以发送文本和图片 */ public class DiamondMember extends Member { public DiamondMember(String name) { super(name); } @Override public void sendText(String to, String text) { super.room.sendText(this.name, to, text); } @Override public void sendImage(String to, String image) { super.room.sendImage(this.name, to, image); } }
/* * 普通会员只可以发送文本,不可以发送图片 */ public class CommonMember extends Member { public CommonMember(String name) { super(name); } @Override public void sendText(String to, String text) { super.room.sendText(this.name, to, text); } @Override public void sendImage(String to, String image) { System.out.println("普通会员不能发送图片"); } }
public class Client { public static void main(String[] args) { AbstractChatRoom chatRoomGroup=new ChatRoomGroup(); Member m1=new DiamondMember("piao"); chatRoomGroup.register(m1); Member m2=new CommonMember("suo"); chatRoomGroup.register(m2); Member m3=new DiamondMember("datou"); chatRoomGroup.register(m3); m2.sendText("piao", "hello!"); m2.sendImage("piao", "picture"); m1.sendText("suo", "How are you ?"); m1.sendImage("suo", "/cy"); m3.sendText("suo", "xixi"); } }
中介者模式的优点:
1、简化了对象之间的交互。
2、将各同事解耦。
3、减少子类生成。
4、可以简化各同事类的设计和实现。
中介者模式的缺点
在具体中介者类中包含了同事之间的交互细节,可能会导致具体中介者类非常复杂,使得系统难以维护。
相关文章推荐
- 设计模式学习笔记十八:中介者模式
- HeadFirst 设计模式学习笔记18--中介者(Mediator)模式拾零
- java/android 设计模式学习笔记(18)---中介者模式
- 【设计模式学习笔记十八】【行为模式】【中介者模式(Mediator)】
- 设计模式学习笔记--Mediator 中介者模式
- 设计模式学习笔记(23)——中介者模式
- 设计模式学习笔记之中介者模式
- 步步为营 .NET 设计模式学习笔记 二十、Mediator(中介者模式)
- 设计模式学习笔记——中介者模式
- 设计模式学习笔记(九:中介者模式)
- 设计模式学习笔记--中介者模式
- 步步为营 .NET 设计模式学习笔记 二十、Mediator(中介者模式)
- 设计模式学习笔记--中介者模式
- 设计模式学习笔记--中介者模式
- 【HeadFirst 设计模式学习笔记】17 中介者(Mediator)模式拾零
- 设计模式学习笔记--中介者模式Mediator pattern(Java版)
- java学习笔记-设计模式23(中介者模式)
- HeadFir st 设计模式学习笔记18--中介者(M ediator)模式拾零
- 步步为营 .NET 设计模式学习笔记 二十、Mediator(中介者模式)
- 设计模式学习笔记——中介者模式