设计模式---中介者模式
????? 之前对设计模式是所闻不所见,不看,不学,只觉得如此深奥的东西,不敢碰。
????? 可最近,频频看到,听到些设计模式,首先是培训时的Command(命令)模式,工厂方法模式,之前知道的单例模式。java培训时的适配器模式,看书看到的中介者模式等等。 使我又觉得设计模式真该看看,学学。
????? 首先,先看中介者模式吧。
????? 中介者模式,简单来说,就像现实中的中介,他将关系复杂,多次相互关联的java对象拆分开,由他作为一个中介者来管理java对象的关联关系,确切的说使对象之间的关系松耦合。例如:A需要引用B,B需要引用C,C又要引用A和B,这就需要一个中介来管理他们之间的关系。
???? 中介者模式的类图,如图所示:
?

?
?
中介管理是:A通过中介来引用B,B通过中介来引用A,那么A,B都继承一个父类,他们都引用父类,而不和相互之间有关联。
代码如下:
public abstract class AbstractMediator { public abstract void changed(AbstractColleague colleague); }?/*** 中介的子类*/public class Mediator extends AbstractMediator { @Override public void changed(AbstractColleague colleague) { colleague.action();//执行传过来的对象的操作 }}public abstract class AbstractColleague {??? ??? protected AbstractMediator mediator;?????? ??? /**???? * ???? * @param mediator 中介者???? */??? public AbstractColleague(AbstractMediator mediator){?????? ??????? this.mediator=mediator;??? }??? ??? /**???? * 子类动作???? */??? public abstract void action();}?
?
/***A类,有此类可以看出A类不直接引用B类**/public class ColleagueA extends AbstractColleague { private AbstractColleague colleague; /** * * @param mediator */ public ColleagueA(AbstractMediator mediator){ super(mediator); } @Override public void action() { System.out.println("这是A的操作"); } public void doSomething(){ super.mediator.changed(colleague); //通过调用中介者,使中介者执行另外一个类的动作 System.out.println("调用成功"); } public void setColleague(AbstractColleague colleague) { this.colleague = colleague; } }?
?
?
public class ColleagueB extends AbstractColleague { private AbstractColleague colleague; /** * * @param mediator */ public ColleagueB(AbstractMediator mediator){ super(mediator); } @Override public void action() { System.out.println("这是B的操作"); } public void doSomething(){ super.mediator.changed(colleague);// System.out.println("调用成功"); } public void setColleague(AbstractColleague colleague) { this.colleague = colleague; }}?
下面是客户端进行调用:
?
public class Client { /** * @param args */ public static void main(String[] args) { Mediator mediator=new Mediator(); ColleagueA a=new ColleagueA(mediator); ColleagueB b=new ColleagueB(mediator); //这里是将B类塞给A类,表明A需要用B类的东西 a.setColleague(b); a.doSomething(); }}?这样A和B就不会直接关联了,即便A要调用C类的东西,也不用改动其代码,直接要客户端执行的时候,塞给A一个C类即可。
?
?