定义
中介者模式又称调停者模式,属于行为型模式;中介者模式包装了一系列对象相互作用的方式,使得这些对象不必互相明显引用。从而使它们可以较松散地耦合。当这些对象中的某些对象之间的相互作用发生改变时,不会立即影响到其他的一些对象之间的相互作用。从而保证这些相互作用可以彼此独立地变化。
模式结构
角色职责
1.抽象中介者(Mediator)角色: 定义了与各同事类之间进行通信的方法。
2.具体中介者(ConcreteMediator): 抽象中介者的子类,协调各个同事对象实现协作行为,维持对各个同事对象的引用。
3.抽象同事类(Colleague): 定义各个同事类的公有方法,并声明一些抽象方法来提供子类实现,同事维持一个抽象中介者的引用,子类可以通过该引用与中介者通信。
4.具体同事类(ConcreteColleague): 抽象同事的子类,每一个同事对象在需要和其他同事对象通信时,先与中介者通信,通过中介者来间接完成与其他同事类的通信,在具体同事类中实现了在抽象同事类中声明的抽象方法。
代码实现
抽象中介者:
public abstract class Mediator
{
protected ArrayList<Colleague> colleagues = new ArrayList<>();
public void add(Colleague colleague)
{
colleagues.add(colleague);
}
public abstract void operation(Colleague colleague);
}
具体中介者:
public class ConcreteMediator extends Mediator
{
@Override
public void operation(Colleague colleague)
{
if(colleague instanceof ConcreteColleague1)
colleagues.get(1).update();
else if(colleague instanceof ConcreteColleague2)
colleagues.get(0).update();
}
}
抽象同事类:
public abstract class Colleague
{
//抽象中介者引用
protected Mediator mediator;
public Colleague(Mediator mediator)
{
this.mediator = mediator;
}
//数据更新方法
public abstract void update();
//数据更改方法
public abstract void changed();
}
具体同事类:
public class ConcreteColleague1 extends Colleague
{
public ConcreteColleague1(Mediator mediator)
{
super(mediator);
}
@Override
public void update()
{
System.out.println("更新同事类1");
}
@Override
public void changed()
{
System.out.println("同事类1数据更改");
mediator.operation(this);
}
}
public class ConcreteColleague2 extends Colleague
{
public ConcreteColleague2(Mediator mediator)
{
super(mediator);
}
@Override
public void update()
{
System.out.println("更新同事类2");
}
@Override
public void changed()
{
System.out.println("同事类2数据更改");
mediator.operation(this);
}
}
测试结果:
public static void main(String[] args)
{
Mediator mediator = new ConcreteMediator();
Colleague colleague1 = new ConcreteColleague1(mediator);
Colleague colleague2 = new ConcreteColleague2(mediator);
mediator.add(colleague1);
mediator.add(colleague2);
colleague1.changed();
colleague2.changed();
}
同事类1数据更改
更新同事类2
同事类2数据更改
更新同事类1
适用场景
1、系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。
2、想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。
优缺点
优点:
1.降低程序复杂度:中介者模式的优点就是减少类间的依赖,把原有的一对多的依赖变成了一对一的依赖;
2.解耦 :减少类间的依赖的同时,也降低了类间的耦合;
缺点:
1.系统稳定差:中介者模式这个“中介”承担了较多的责任,因此一旦这个中介对象处理问题,那么整个系统就会收到重大的影响。
2.逻辑复杂:中介者会膨胀的很大,并且逻辑复杂,同时类越多中介者的逻辑就越复杂。