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

被折叠的 条评论
为什么被折叠?



