中介者模式,用一个中介者对象来封装一系列的对象交互。中介者使各对象不需要显式的相互引用,从而使其耦合松散,而且可以独立的改变他们之间的交互。
使用场景:
中介者模式模式一般应用于一组对象以定义良好但是复杂的方式进行通信的场合,以及向定制一个分布在多个类中的行为,而又不太像生成太多子类的场合。
优缺点:
- 适当地使用中介者模式可以避免同事类之间的过度耦合,使得各同事类之间可以相对独立地使用。
- 使用中介者模式可以将对象间一对多的关联转变为一对一的关联,使对象间的关系易于理解和维护。
- 使用中介者模式可以将对象的行为和协作进行抽象,能够比较灵活的处理对象间的相互作用。
- 当同事类非常多的时候会造成中介类特别的复杂,而且如果中介类出现问题,那么整个系统就会出现问题。
UML图:
代码实现:
package com.liran.main.DesignPattern.中介模式;
/**
* 中介者模式
* Created by LiRan on 2016-03-04.
*/
public class Mediator_Pattern {
public static void main(String[] args) {
ConcreteMediator mediator = new ConcreteMediator();
ConcreteColleague1 colleague1 = new ConcreteColleague1(mediator);
ConcreteColleague2 colleague2 = new ConcreteColleague2(mediator);
mediator.setColleague1(colleague1);
mediator.setColleague2(colleague2);
colleague1.send("你吃饭了吗?");
colleague2.send("你猜猜");
}
}
/**
* 抽象中介者类
*/
abstract class Mediator {
/***
* 定义一个抽象的发送消息的方法
*
* @param message 消息
* @param colleague 同事对象
*/
abstract public void send(String message, Colleague colleague);
}
/**
* 抽象同事类
*/
abstract class Colleague {
protected Mediator mediator;
public Colleague(Mediator mediator) {
this.mediator = mediator;
}
}
/**
* 具体的中介者
*/
class ConcreteMediator extends Mediator {
private ConcreteColleague1 colleague1;
private ConcreteColleague2 colleague2;
public void setColleague1(ConcreteColleague1 colleague1) {
this.colleague1 = colleague1;
}
public void setColleague2(ConcreteColleague2 colleague2) {
this.colleague2 = colleague2;
}
@Override
public void send(String message, Colleague colleague) {
if (colleague == colleague1) {
colleague1.Notify(message);
} else {
colleague2.Notify(message);
}
}
}
/**
* 具体的同事类
*/
class ConcreteColleague1 extends Colleague {
public ConcreteColleague1(Mediator mediator) {
super(mediator);
}
public void Notify(String msg) {
System.out.println("同事1得到消息:" + msg);
}
public void send(String msg) {
mediator.send(msg, this);
}
}
/**
* 具体的同事类
*/
class ConcreteColleague2 extends Colleague {
public ConcreteColleague2(Mediator mediator) {
super(mediator);
}
public void Notify(String msg) {
System.out.println("同事2得到消息:" + msg);
}
public void send(String msg) {
mediator.send(msg, this);
}
}