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

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

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

猜你喜欢

转载自ssg108.iteye.com/blog/1171856