行为类模式(五):中介者(Mediator)

时间:2023-03-09 20:00:47
行为类模式(五):中介者(Mediator)

定义

定义一个中介对象来封装系列对象之间的交互。中介者使各个对象不需要显示地相互引用,从而使其耦合性松散,而且可以独立地改变他们之间的交互。

试想一下,如果多个类之间相互都有引用,那么当其中一个类修改时,势必导致所有相关联的类都需要修改,如果引入一个中介类来管理所有类的交互,即所有类都通过中介类和其它类交互,则可以大大降低多个类之间的耦合;中介对象主要是用来封装行为的,行为的参与者就是那些对象,但是通过中介者,这些对象不用相互知道。

UML

行为类模式(五):中介者(Mediator)

优点

  1. 降低了系统对象之间的耦合性,使得对象易于独立的被复用;
  2. 提高系统的灵活性,使得系统易于扩展和维护;
  3. 可以让对象之间传递的消息变得简单而且大幅减少。

缺点

  1. 如果设计不当,中介者对象本身会变得过于复杂;
  2. 因为中介承担了较多的责任,所以一旦这个中介对象出现了问题,那么整个系统就会受到重大的影响。

应用场景

  1. 一组定义良好的对象,现在要进行复杂的通信。
  2. 定制一个分布在多个类中的行为,而又不想生成太多的子类。

示例

考虑一种简单的情况只有两个类A和B,类中各有一个数字,并且要保证类B中的数字永远是类A中数字的100倍。也就是说,当修改类A的数时,将这个数字乘以100赋给类B,而修改类B时,要将数除以100赋给类A。

Java

 public class Main
{
public static void main(String[] args)
{
AbstractColleague collA = new ColleagueA();
AbstractColleague collB = new ColleagueB(); AbstractMediator am = new Mediator(collA, collB); System.out.println("==========通过设置A影响B==========");
collA.setNumber(1000, am);
System.out.println("collA的number值为:" + collA.getNumber());
System.out.println("collB的number值为A的100倍:" + collB.getNumber()); System.out.println("==========通过设置B影响A==========");
collB.setNumber(1000, am);
System.out.println("collB的number值为:" + collB.getNumber());
System.out.println("collA的number值为B的0.01倍:" + collA.getNumber());
} /**
* 中介类基类
*/
public static abstract class AbstractMediator
{
protected AbstractColleague A;
protected AbstractColleague B; public AbstractMediator(AbstractColleague a, AbstractColleague b)
{
A = a;
B = b;
} public abstract void AaffectB(); public abstract void BaffectA();
} /**
* 同事类基类
*/
public static abstract class AbstractColleague
{
protected int number; public int getNumber()
{
return number;
} public void setNumber(int number)
{
this.number = number;
} //注意这里的参数不再是同事类,而是一个中介者
public abstract void setNumber(int number, AbstractMediator am);
} /**
* 同事类A
*/
public static class ColleagueA extends AbstractColleague
{ public void setNumber(int number, AbstractMediator am)
{
this.number = number;
am.AaffectB();
}
} /**
* 同事类B
*/
public static class ColleagueB extends AbstractColleague
{
@Override
public void setNumber(int number, AbstractMediator am)
{
this.number = number;
am.BaffectA();
}
} /**
* 中介实现类
*/
public static class Mediator extends AbstractMediator
{
public Mediator(AbstractColleague a, AbstractColleague b)
{
super(a, b);
} //处理A对B的影响
public void AaffectB()
{
int number = A.getNumber();
B.setNumber(number * 100);
} //处理B对A的影响
public void BaffectA()
{
int number = B.getNumber();
A.setNumber(number / 100);
}
}
}