设计模式学习笔记——中介者模式

原文:http://blog.csdn.net/hackerain/article/details/7553900

定义:

用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示的互相交互,从而使其耦合松散,而且可以独立的改变他们之间的交互


模式动机:

1、在面向对象的软件设计与开发过程中,根据“单一职责原则”,我们应该尽量将对象细化,使其只负责或呈现单一的职责

2、对于一个模块,可能由很多对象构成,而且这些对象之间可能存在相互的引用, 为了减少对象两两之间复杂的引用关系,使之成为一个松耦合的系统,我们需要使用中介者模式 ,这就是中介者模式的模式动机


实例分析:虚拟聊天室

某论坛系统欲增加一个虚拟聊天室,允许论坛会员通过该聊天室进行信息交流,普通会员(CommonMember)可以给其他会员发送文本信息,钻石会员(DiamondMember)既可以给其他会员发送文本信息,还可以发送图片信息。

在本例中,聊天室就是中介者的角色,会员之间的沟通都通过中介者,这样就将错综复杂的会员关系,变得有条有理了。

其类图如下:


其实现代码如下:

[java]  view plain copy
  1. public abstract class AbstractChatRoom {  
  2.       
  3.     public abstract void register(Member member);  
  4.       
  5.     public abstract void sendText(String from, String to, String text);  
  6.       
  7.     public abstract void sendImage(String from, String to, String image);  
  8. }  
[java]  view plain copy
  1. public class ChatRoomGroup extends AbstractChatRoom {  
  2.       
  3.     private Map<String,Member> members=new HashMap<String,Member>();  
  4.       
  5.     @Override  
  6.     public void register(Member member) {  
  7.         if(members.containsKey(member.getName()))  
  8.             System.out.println("已被注册!");  
  9.         else  
  10.         {  
  11.             this.members.put(member.getName(), member);  
  12.             member.setRoom(this);//要在这里将会员中的ChatRoomGroup设置为本类对象  
  13.         }  
  14.     }  
  15.   
  16.     @Override  
  17.     public void sendText(String from, String to, String text) {  
  18.           
  19.         if(members.containsKey(from) && members.containsKey(to)){  
  20.             Member mTo=members.get(to);  
  21.             mTo.receiveText(from, text);  
  22.         }  
  23.           
  24.     }  
  25.   
  26.     @Override  
  27.     public void sendImage(String from, String to, String image) {  
  28.         if(members.containsKey(from) && members.containsKey(to)){  
  29.             Member mTo=members.get(to);  
  30.             mTo.receiveImage(from, image);  
  31.         }  
  32.     }  
  33.       
  34. }  
[java]  view plain copy
  1. public abstract class Member {  
  2.       
  3.     protected String name;  
  4.     protected AbstractChatRoom room;  
  5.       
  6.     public Member(String name){  
  7.         this.name=name;  
  8.     }  
  9.     public String getName() {  
  10.         return name;  
  11.     }  
  12.     public void setName(String name) {  
  13.         this.name = name;  
  14.     }  
  15.     public AbstractChatRoom getRoom() {  
  16.         return room;  
  17.     }  
  18.     public void setRoom(AbstractChatRoom room) {  
  19.         this.room = room;  
  20.     }  
  21.       
  22.     public abstract void sendText(String to, String text);  
  23.       
  24.     public abstract void sendImage(String to, String image);  
  25.       
  26.     public void receiveText(String from , String text){  
  27.         System.out.println(this.name+" receive text from "+from+": "+text);  
  28.     }  
  29.       
  30.     public void receiveImage(String from , String image){  
  31.         System.out.println(this.name+" receive image from "+from+": "+image);  
  32.     }  
  33. }  
[java]  view plain copy
  1. /* 
  2.  * 钻石会员可以发送文本和图片 
  3.  */  
  4. public class DiamondMember extends Member {  
  5.       
  6.     public DiamondMember(String name) {  
  7.         super(name);  
  8.     }  
  9.   
  10.     @Override  
  11.     public void sendText(String to, String text) {  
  12.         super.room.sendText(this.name, to, text);  
  13.     }  
  14.   
  15.     @Override  
  16.     public void sendImage(String to, String image) {  
  17.         super.room.sendImage(this.name, to, image);  
  18.     }  
  19.   
  20. }  
[java]  view plain copy
  1. /* 
  2.  * 普通会员只可以发送文本,不可以发送图片 
  3.  */  
  4. public class CommonMember extends Member {  
  5.   
  6.     public CommonMember(String name) {  
  7.         super(name);  
  8.     }  
  9.   
  10.     @Override  
  11.     public void sendText(String to, String text) {  
  12.         super.room.sendText(this.name, to, text);  
  13.     }  
  14.   
  15.     @Override  
  16.     public void sendImage(String to, String image) {  
  17.         System.out.println("普通会员不能发送图片");  
  18.     }  
  19.   
  20. }  
[java]  view plain copy
  1. public class Client {  
  2.     public static void main(String[] args) {  
  3.           
  4.         AbstractChatRoom chatRoomGroup=new ChatRoomGroup();  
  5.           
  6.         Member m1=new DiamondMember("piao");  
  7.         chatRoomGroup.register(m1);  
  8.           
  9.         Member m2=new CommonMember("suo");  
  10.         chatRoomGroup.register(m2);  
  11.           
  12.         Member m3=new DiamondMember("datou");  
  13.         chatRoomGroup.register(m3);  
  14.           
  15.         m2.sendText("piao""hello!");  
  16.         m2.sendImage("piao""picture");  
  17.           
  18.         m1.sendText("suo""How are you ?");  
  19.         m1.sendImage("suo""/cy");  
  20.           
  21.         m3.sendText("suo""xixi");  
  22.     }  
  23. }  

中介者模式的优点:

1、 简化了对象之间的交互。
2、 将各同事解耦。
3、 减少子类生成。
4、 可以简化各同事类的设计和实现。


中介者模式的缺点
在具体中介者类中包含了同事之间的交互细节,可能会导致 具体中介者类非常复杂 ,使得 系统难以维护

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值