前言
文章内容主要参考了刘伟主编的《设计模式(第2版)》,同时也结合了自己的一些思考和理解,希望能帮到大家。
本篇讲解中介者模式。
对于一个模块,可能由很多对象构成,而且这些对象之间可能存在相互的引用,为了减少对象两两之间复杂的引用关系,使之成为一个松耦合的系统,我们需要使用中介者模式,这就是中介者模式的模式动机。
正文
一、定义
中介者模式(Mediator Pattern)定义:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式又称为调停者模式,它是一种对象行为型模式。
其实中介者更像是一个群一个班级。对于一个多对多的复杂关系中,为了避免各对象的直接调关联,就通过增加一个中介者,去帮我们负责处理及交接。如果直接关联,对于增加一个关系,或者关系中的一个对象改变了,其他与其有关联的也会随之改动,所以通过在两者之间添加一层,改动则各自改动,但是交互还是通过中介者。
中介者的作用:
中转作用(结构性):通过中介者提供的中转作用,各个同事对象就不再需要显式引用其他同事,当需要和其他同事进行通信时,通过中介者即可。该中转作用属于中介者在结构上的支持。
协调作用(行为性):中介者可以更进一步的对同事之间的关系进行封装,同事可以一致地和中介者进行交互,而不需要指明中介者需要具体怎么做,中介者根据封装在自身内部的协调逻辑,对同事的请求进行进一步处理,将同事成员之间的关系行为进行分离和封装。该协调作用属于中介者在行为上的支持。
二、情景假设
某论坛系统欲增加一个虚拟聊天室,允许论坛会员通过该聊天室进行信息交流,普通会员(CommonMember)可以给其他会员发送文本信息,钻石会员(DiamondMember)既可以给其他会员发送文本信息,还可以发送图片信息。该聊天室可以对不雅字符进行过滤,如“日”等字符;还可以对发送的图片大小进行控制。用中介者模式设计该虚拟聊天室。
三、情景分析
关于上面情景的类图(具体分析在下面)
如果说我们直接采用单纯的交互关系: (1) 系统结构复杂且耦合度高:每一个会员都与多个其他会员之间产生相互关联和调用,若一个会员对象发生变化,需要跟踪与之有关联的其他所有会员并进行处理,系统组件之间呈现一种较为复杂的网状结构,会员之间的耦合度高。 (2) 组件的可重用性差:由于每一个会员和其他会员之间都具有很强的关联,若没有其他组件的支持,一个组件很难被另一个系统或模块重用,这些组件表现出来更像一个不可分割的整体,而在实际使用时,我们往往需要每一个会员都能够单独重用,而不是重用一个由多个会员组成的复杂结构。 (3) 系统的可扩展性差:如果在上述系统中增加一个新的会员类,则必须修改与之交互的其他会员类的源代码,将导致多个类的源代码需要修改,这违反了“开闭原则”,可扩展性和灵活性欠佳。
所以便采用中介者模式解决上面的问题,
首先定义抽象中介者类AbstractChatroom(抽象聊天室类)
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 image);
}
抽象同事类Member(抽象会员类)
public abstract class Member{
protected AbstractChatroom chatroom;
protected String name;
public Member(String name){
this.name = name;
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public AbstractChatroom getChatroom(){
return chatroom