之前对设计模式是所闻不所见,不看,不学,只觉得如此深奥的东西,不敢碰。
可最近,频频看到,听到些设计模式,首先是培训时的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类即可。