读书人

设计形式-中介者模式

发布时间: 2012-07-04 19:33:55 作者: rapoo

设计模式---中介者模式

????? 之前对设计模式是所闻不所见,不看,不学,只觉得如此深奥的东西,不敢碰。

????? 可最近,频频看到,听到些设计模式,首先是培训时的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类即可。

?

?

读书人网 >软件开发

热点推荐