中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。
主要解决:对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理。、
优点: 1、降低了类的复杂度,将一对多转化成了一对一。 2、各个类之间的解耦。 3、符合迪米特原则。
缺点:中介者会庞大,变得复杂难以维护。
使用场景: 1、系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。 2、想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。
/**
* 抽象电话类
* @author XXJ
*
* 2019年3月2日 下午4:45:24
*/
public abstract class AbstractTelephone {
protected String number;
protected boolean flag;
public AbstractTelephone(String number){
this.number = number;
this.flag = false;
}
//拨号
public abstract void call(String number,Mediator mediator);
//收到电话
public abstract void get(String number);
/**
* @return the number
*/
public String getNumber() {
return number;
}
/**
* @param number the number to set
*/
public void setNumber(String number) {
this.number = number;
}
/**
* @return the flag
*/
public boolean isFlag() {
return flag;
}
/**
* @param flag the flag to set
*/
public void setFlag(boolean flag) {
this.flag = flag;
}
}
public class TelephoneA extends AbstractTelephone {
public TelephoneA(String number){
super(number);
}
@Override
public void call(String number,Mediator mediator) {
System.out.println(super.number+">>打电话给>>"+number);
mediator.changeNumberB();
}
@Override
public void get(String number) {
System.out.println(super.number+"<<收到号码<<" + number);
}
}
public class TelephoneB extends AbstractTelephone {
public TelephoneB(String number){
super(number);
}
@Override
public void call(String number,Mediator mediator) {
System.out.println(super.number+">>打电话给>>"+number);
mediator.changeNumberA();
}
@Override
public void get(String number) {
System.out.println(super.number+"<<收到号码<<" + number);
}
}
中介类也可以抽象出来,也可以省略,我这里省略了这一步。
/**
* 中介类
* @author XXJ
*
* 2019年3月2日 下午4:48:28
*/
public class Mediator {
private AbstractTelephone a;
private AbstractTelephone b;
public Mediator(AbstractTelephone a,AbstractTelephone b){
this.a = a;
this.b = b;
}
public void changeNumberA(){
if (a.isFlag()) {
System.out.println(a.getNumber()+"在通话中,请稍后再拨...");
return;
}else{
a.get(b.getNumber());
b.setFlag(true);
a.setFlag(true);
}
}
public void changeNumberB(){
if (b.isFlag()) {
System.out.println(b.getNumber()+"在通话中,请稍后再拨...");
return;
}else{
b.get(a.getNumber());
a.setFlag(true);
b.setFlag(true);
}
}
}
public class Test {
public static void main(String[] args) {
AbstractTelephone pa = new TelephoneA("13544332344");
AbstractTelephone pb = new TelephoneB("13454442323");
Mediator mediator = new Mediator(pa, pb);
pa.call("13454442323", mediator);
}
}