中介者模式-Mediator
中介者模式用一个中介对象来封装系列对象之间的交互。中介者使各个对象不需要显式地相互引用,从而使其耦合性松散,并且可以独立地改变他们之间的交互。
一、类图
中介者模式主要包含如下几个角色:
- Mediator: 抽象中介者。定义了同事对象到中介者对象之间的接口。
- ConcreteMediator: 具体中介者。实现抽象中介者的方法,它需要知道所有的具体同事类,同时需要从具体的同事类那里接收信息,并且向具体的同事类发送信息。
- Colleague: 抽象同事类。
- ConcreteColleague: 具体同事类。每个具体同事类都只需要知道自己的行为即可,但是他们都需要认识中介者。
二、示例
Mediator : 为 Colleague 对象定义一个交流接口。
abstract class Mediator { public abstract void Send(String message, Colleague colleague); }
ConcreteMediator : 实现 Mediator 中的交流接口。 这个类中需要了解并维护所有的 colleague 对象。
class ConcreteMediator extends Mediator { private ConcreteColleague1 colleague1; private ConcreteColleague2 colleague2; public void setColleague1(ConcreteColleague1 colleague1) { this.colleague1 = colleague1; } public void setColleague2(ConcreteColleague2 colleague2) { this.colleague2 = colleague2; } @Override public void Send(String message, Colleague colleague) { if (colleague == colleague1) { colleague2.Notify(message); } else if (colleague == colleague2){ colleague1.Notify(message); } else { System.out.println("Error!"); } } }
Colleague组 : 每个 Colleague 对象应该知道它的 Mediator 对象,但不知道其他同事对象。它只能联系 Mediator 对象。
abstract class Colleague { protected Mediator mediator; public Colleague(Mediator mediator) { this.mediator = mediator; } public void Send(String message) { mediator.Send(message, this); } public abstract void Notify(String message); } class ConcreteColleague1 extends Colleague { public ConcreteColleague1(Mediator mediator) { super(mediator); } @Override public void Notify(String message) { System.out.println("同事1得到信息:" + message); } } class ConcreteColleague2 extends Colleague { public ConcreteColleague2(Mediator mediator) { super(mediator); } @Override public void Notify(String message) { System.out.println("同事2得到信息:" + message); } }
测试
public class MediatorPattern { public static void main(String[] args) { ConcreteMediator mediator = new ConcreteMediator(); ConcreteColleague1 colleague1 = new ConcreteColleague1(mediator); ConcreteColleague2 colleague2 = new ConcreteColleague2(mediator); mediator.setColleague1(colleague1); mediator.setColleague2(colleague2); colleague1.Send("How are you?"); colleague2.Send("Fine, thank you. And you?"); colleague1.Send("I'm fine. Thankes."); } }
三、优缺点
优点:
1、 简化了对象之间的关系,将系统的各个对象之间的相互关系进行封装,将各个同事类解耦,使系统成为松耦合系统。
2、 减少了子类的生成。
3、 可以减少各同事类的设计与实现。
缺点:
由于中介者对象封装了系统中对象之间的相互关系,导致其变得非常复杂,使得系统维护比较困难。
四、SpringMVC中的中介者模式
中介者模式也叫做调停者模式,是什么意思呢?一个对象要和N多个对象交流,就像对象间的战争,很混乱。这时,需要加入一个中心,所有的类都和中心交流,中心说怎么处理就怎么处理。使用过Struts2,SpringMVC框架,我们就应该知道其中的C(Controller)就是一个中介者,叫做前端 控制器,它的作用就是把M(Model,业务逻辑)和V(View,视图)隔离开, 协调M和V协同工作,把M运行的结果和V代表的视图融合成一个前端可以展示的页面,减少 M和V的依赖关系。MVC框架已经成为一个非常流行、成熟的开发框架,这也是中介者模式 的优点的一个体现。
……更多设计模式的内容,可以访问Refactoring.Guru
不积跬步,无以至千里。不积小流,无以成江海!