中介者模式定义:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式又称为调停者模式,它是一种对象行为型模式。
中介者模式针对的问题是,解决一系列对象之间复杂的耦合关系,这一系列对象往往是“多对多”的耦合关系,中介者模式采用一个中介者对象将这一系列对象集中管理,而各个对象也将自己与其它对象的交互行为委托给中介者处理,从而减少这一系列对象之间的耦合。
中介者模式包含以下主要角色:
抽象中介者(Mediator)角色:它是中介者的接口,提供了同事对象注册与转发同事对象信息的抽象方法。
具体中介者(ConcreteMediator)角色:实现中介者接口,定义一个 List 来管理同事对象,协调各个同事角色之间的交互关系,因此它依赖于同事角色。
抽象同事类(Colleague)角色:定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能。
具体同事类(Concrete Colleague)角色:是抽象同事类的实现者,当需要与其他同事对象交互时,由中介者对象负责后续的交互。
类图如下:
下面我们就以房地产中介举个例子,首先是一个中介接口,有两个方法:注册用户和转发消息,然后有具体的中介者,它维护一个用户列表,再者就是抽象的用户类,持有一个中介者对象,同时提供两个抽象方法接收和发送供子类实现,最后就是具体的用户类。
package mediator;public interface Mediator { void register(Customer cu); void relay(Customer cu,String msg);}
package mediator;import java.util.ArrayList;import java.util.List;public class ConcreteMediator implements Mediator { private Listlist = new ArrayList (); @Override public void register(Customer cu) { if(!list.contains(cu)) { list.add(cu); cu.setMedium(this); } } @Override public void relay(Customer cu,String msg) { for (Customer customer : list) { if(!customer.equals(cu)) { customer.receive(cu, msg); } } }}
package mediator;public abstract class Customer { protected Mediator mediator; protected String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public Customer(String name) { super(); this.name = name; } public void setMedium(Mediator mediator) { this.mediator=mediator; } public abstract void receive(Customer cu,String msg); public abstract void send(Customer cu,String msg);}
package mediator;public class ConcreteCustomer extends Customer { public ConcreteCustomer(String name) { super(name); } @Override public void receive(Customer cu, String msg) { System.out.println(name + "收到消息:" + cu.getName() + "说" + msg); } @Override public void send(Customer cu, String msg) { System.out.println(name + "发布消息说:"+ msg); mediator.relay(cu, msg); }}
运行测试代码
从demo中可以看出通过中介者,买房和卖房实现了沟通,但双方乃至多方并不耦合,张三不需要为了告诉李四他要卖房而持有一个李四的对象。
中介者模式是一种对象行为型模式,其主要优点如下:降低了对象之间的耦合性,使得对象易于独立地被复用;将对象间的一对多关联转变为一对一的关联,提高系统的灵活性,使得系统易于维护和扩展。其主要缺点是:当同事类太多时,中介者的职责将很大,它会变得复杂而庞大,以至于系统难以维护。
中介者模式适用于以下场景:
当对象之间存在复杂的网状结构关系而导致依赖关系混乱且难以复用时。
当想创建一个运行于多个类之间的对象,又不想生成新的子类时。
在实际开发中,通常采用以下两种方法来简化中介者模式,使开发变得更简单:
不定义中介者接口,把具体中介者对象实现成为单例。
同时对象不持有中介者,而是在需要的时直接获取中介者对象并调用。