中介者模式定义
用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示的相互作用,从而是耦合松散,而且可以独立地改变它们之间的交互。
中介者模式的使用场景
当对象之间的交互操作很多且每个对象的行为操作都依赖彼此时,为防止在修改一个对象的行为时,同时涉及修改很多其他对象的行为,可采用中介者模式,来解决紧耦合问题。该模式将对象之间的多对多关系变成一对多关系,中介者对象将系统从网状结构变成以调停者为中心的星形结构,达到降低系统的复杂性,提高可扩展性的作用。
中介者模式的UML类图
示例代码:
//同事抽象类
abstract class Colleague {
protected int number;
public int getNumber(){
return number;
}
public void setNumber(int number){
this.number = number;
}
public abstract void setNumber(int number, Mediator mediator);
}
//中介者抽象类
abstract class Mediator {
protected Colleague A;
protected Colleague B;
public Mediator(Colleague a,Colleague b){
A = a;
B = b;
}
public abstract void affectB();
public abstract void affectA();
}
//具体同事类的实现
public class ConcreteColleague1 extends Colleague {
@Override
public void setNumber(int number, Mediator mediator) {
//改变,设置同事对象中的number数值
this.number = number;
mediator.affectB();//调用中介者对象中方法,通过中介者对象通知其他同事类交互操作
}
}
//具体同事类的实现
public class ConcreteColleague2 extends Colleague {
@Override
public void setNumber(int number, Mediator mediator) {
//改变或设置同事对象中的number数值
this.number = number;
mediator.affectA();//调用中介者对象中的方法,通过中介者对象通知其他同事类交互操作
}
}
//中介者具体实现类
public class ConcreteMediator extends Mediator{
public ConcreteMediator(Colleague a, Colleague b) {
super(a, b);
}
@Override
public void affectB() {
int number = A.getNumber();
B.setNumber(number*100); //A改变,通知B修改
}
@Override
public void affectA() {
int number = B.getNumber();
A.setNumber(number/100);//B改变,通知A修改
}
}
//客户端
public class Client {
public static void main(String[] args) {
Colleague colleague1 = new ConcreteColleague1();
Colleague colleague2 = new ConcreteColleague2();
Mediator mediator = new ConcreteMediator(colleague1, colleague1);
System.out.println("==========通过设置A影响B==========");
colleague1.setNumber(1000, mediator);
System.out.println("collA的number值为:" + colleague1.getNumber());
System.out.println("collB的number值为A的10倍:" + colleague2.getNumber());
System.out.println("==========通过设置B影响A==========");
colleague2.setNumber(1000, mediator);
System.out.println("collB的number值为:" + colleague2.getNumber());
System.out.println("collA的number值为B的0.1倍:" + colleague1.getNumber());
}
}
本示例中ConcreteColleague1和ConcreteColleague2类互相影响,不是分别同时调用两个对象的方法来实现对象中数值的变化来达到交互,而是通过中介者ConcreteMediator对象达到交互操作,这样的好处是解耦合,中介者可以是多对多交互操作的对象
总结
在面向对象的编程语言里,一个类必然会与其他类产生依赖关系,如果这种依赖关系如网状般错综复杂,那么必然会影响我们的代码逻辑以及执行效率,适当得使用中介者模式可以对这种依赖关系进行解耦使逻辑结构清晰,但是,如果几个类间的依赖关系并不复杂,使用中介者模式反而会使得原本不复杂的逻辑结构变得复杂,所以,我们在决定使用中介者模式之前要多方考虑。