中介者模式
概述
中介者模式(Mediator
)又称为调解者模式或调停者模式,中介者是一中行为型模式,听名字大家应该都知道了起到了中间桥梁的作用,
在软件开发过程中,势必会碰到这样一种情况,多个类或多个子系统相互交互,而且交互很繁琐,导致每个类都必须知道他需要交互的类,这样它们的耦合会显得异常厉害。
如果有这么一个中间者能够和所有的子系统交互,就会变得清晰的多.中介者模式就起到了这个作用.
定义
中介者包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用.从而使他们可以松散耦合.当某些对象之间的作用发生改变时,不会立即影响其他的一些对象之间的相互作用,
保证这些作用可以彼此独立的变化.中介者模式将多对多的相互作用转化为一对多的相互作用,终结者模式将对象的行为和协作抽象化.把对象在小尺度的行为上与其他对象的相互作用分开处理
UML
Mediator
: 抽象中介者角色,定义好同事类对象到中介者对象的接口,用于各个同事类之间的通信.ConcreteMediator
: 具体中介者角色,继承于抽象中介者.实现抽象中介者中定义的事件方法,从一个同事类接收消息,然后通过消息影响其他同时类Colleague
: 抽象同事类角色,定义了中介者对象的接口,只知道中介者而而不知道其他同事类对象.ConcreteColleague
: 具体同事类角色,继承于抽象同事类,只知道本身在小范围内的行为,不知道其在大范围内的目的.
使用场景
- 对象间的交互操作很多且每个对象的行为操作都依赖彼此,导致依赖关系结构混乱时.
- 向通过一个中间类来封装多个类中的行为,而又不行生成太多的子类
例子
中介者模式的例子很多,如一个网络聊天室
- 首先定义
Mediator
对象
package com.dyleaf.behavior.MediatorPattern;
import java.util.ArrayList;
import java.util.List;
public abstract class Mediator {
protected List<User> userList;
public Mediator() {
userList = new ArrayList<User>();
}
public void addUser(User user){
user.setMediator(this);
this.userList.add(user);
}
public abstract void operation(User user, String msg);
}
- 定义
Colleague
对象
package com.dyleaf.behavior.MediatorPattern;
public abstract class User {
protected Mediator mediator;
protected String name;
public User(String name) {
this.name = name;
}
protected void setMediator(Mediator mediator){
this.mediator = mediator;
}
protected abstract void sendMessage(String msg);
protected abstract void getMessage(String msg);
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
- 具体的
Colleague
对象
//vip
public class VIPUser extends User{
public VIPUser(String name) {
super(name);
}
@Override
protected void sendMessage(String msg) {
this.mediator.operation(this, msg);
}
@Override
protected void getMessage(String msg) {
System.out.println(this.getName() + " get msg:"+msg);
}
}
//common
public class CommonUser extends User{
public CommonUser(String name) {
super(name);
}
@Override
protected void sendMessage(String msg) {
this.mediator.operation(this, msg);
}
@Override
protected void getMessage(String msg) {
System.out.println(this.getName() + " get msg:"+msg);
}
}
- 具体的
mediator
对象
package com.dyleaf.behavior.MediatorPattern;
public class ChatRoomMediator extends Mediator {
@Override
public void operation(User user, String msg) {
System.out.println(user.getName() + "send a msg : " + msg);
for(User userTmp : this.userList){
userTmp.getMessage(msg);
}
}
}
- 客户端调用
package com.dyleaf.behavior.MediatorPattern;
public class Test {
public static void main(String[] args) {
CommonUser user1 = new CommonUser("小王");
CommonUser user2 = new CommonUser("小陈");
VIPUser vipUser = new VIPUser("小张");
Mediator chatRoom = new ChatRoomMediator();
chatRoom.addUser(user1);
chatRoom.addUser(user2);
chatRoom.addUser(vipUser);
user2.sendMessage("hello everybody~");
}
}
优缺点
优点:
- 避免同事类之间的过度耦合,使得各同事类之间可以相互独立的使用
- 可以将对象间一对多的关联转变为一对一的关联,便于维护
- 将对象的行为和协作进行抽象,能够比较灵活的处理对象之间相互作用.
缺点:
- 若果几个类间的依赖关系不复杂,使用中介者模式反而会使逻辑结构变得复杂.
- 由于中介者封装了系统中对象间的相互关系,导致中介者会变得复杂.