1. 程式人生 > >JAVA的23種設計模式---中介者模式

JAVA的23種設計模式---中介者模式

概要:

該文章參考了《設計模式之禪》一書及一些前輩的部落格文章

1.該文章闡述了中介者模式的基礎原理及示例程式碼;
2.該文章適合初學設計模式的技術人員研習;
3.該文章有許多不足之處,請各位大咖指正,噴子繞道;

正文:

中介者模式:用一箇中介物件封裝一系列的物件互動,中介者使各物件不需要顯示地相互作用,從而使其耦合鬆散,而且可以獨立的改變他們之間的互動

1.中介者模式示例程式碼實現:

package com.csdn;
/**
 * 抽象中介者
 * @author Administrator
 *
 */
public abstract class AbstractMediator
{
//魏國 protected Wei wei; //蜀國 protected Shu shu; //吳國 protected Wu wu; //構造器初始化三國 public AbstractMediator(){ this.wei = new Wei(this); this.shu = new Shu(this); this.wu = new Wu(this); } //最重要的事件方法,處理多個物件之間的關係 public abstract void execute(String string,Object...objects) throws
Exception; }
package com.csdn;

import java.lang.reflect.Field;
/**
 * 具體中介者
 * @author Administrator
 *
 */
public class Mediator extends AbstractMediator{
    //中介者最重要的方法,處理各方關係
    @Override
    public void execute(String string, Object... objects) throws Exception {
        //魏國請求和平
        if(string.equalsIgnoreCase("weiForPeace"
)){ this.weiForPeace(); //蜀國請求和平 }else if(string.equalsIgnoreCase("shuForPeace")){ this.shuForPeace(); //吳國請求和平 }else if(string.equalsIgnoreCase("wuForPeace")) { this.wuForPeace(); //魏國實力增長導致另外兩國實力下降 }else if(string.equalsIgnoreCase("weiIncrease")){ this.weiIncrease(); //蜀國實力增長導致另外兩國實力下降 }else if(string.equalsIgnoreCase("shuIncrease")){ this.shuIncrease(); //吳國實力增長導致另外兩國實力下降 }else if(string.equalsIgnoreCase("wuIncrease")){ this.wuIncrease(); } } //吳國實力增長導致另外兩國實力下降執行方法 private void wuIncrease() { super.wei.decrease(); super.shu.decrease(); } //蜀國實力增長導致另外兩國實力下降執行方法 private void shuIncrease() { super.wei.decrease(); super.wu.decrease(); } //魏國實力增長導致另外兩國實力下降執行方法 private void weiIncrease() { super.shu.decrease(); super.wu.decrease(); } //魏國請求和平,三國實力重置 private void weiForPeace() throws Exception { System.out.println("魏國求和,三國實力重置!"); System.out.println("魏國實力恢復成功!"+"實力為:"+recovery(super.wei.getClass(), "WEI_STRENGTH")); System.out.println("蜀國實力恢復成功!"+"實力為:"+recovery(super.shu.getClass(), "SHU_STRENGTH")); System.out.println("吳國實力恢復成功!"+"實力為:"+recovery(super.wu.getClass(), "WU_STRENGTH")); } //蜀國請求和平,三國實力重置 private void shuForPeace() throws Exception { System.out.println("蜀國求和,三國實力重置!"); System.out.println("魏國實力恢復成功!"+"實力為:"+recovery(super.wei.getClass(), "WEI_STRENGTH")); System.out.println("蜀國實力恢復成功!"+"實力為:"+recovery(super.shu.getClass(), "SHU_STRENGTH")); System.out.println("吳國實力恢復成功!"+"實力為:"+recovery(super.wu.getClass(), "WU_STRENGTH")); } //吳國請求和平,三國實力重置 private void wuForPeace() throws Exception { System.out.println("吳國求和,三國實力重置!"); System.out.println("魏國實力恢復成功!"+"實力為:"+recovery(super.wei.getClass(), "WEI_STRENGTH")); System.out.println("蜀國實力恢復成功!"+"實力為:"+recovery(super.shu.getClass(), "SHU_STRENGTH")); System.out.println("吳國實力恢復成功!"+"實力為:"+recovery(super.wu.getClass(), "WU_STRENGTH")); } //通過反射,重置三國實力具體方法 public int recovery(Class clazz,String string) throws Exception{ Field fieldWei = clazz.getDeclaredField(string); fieldWei.setAccessible(true); fieldWei.setInt(string, 10); return fieldWei.getInt(string); } }
package com.csdn;
/**
 * 抽象同事類,每個國家都需實現
 * @author Administrator
 *
 */
public abstract class AbstractColleague {
    //中介者
    protected AbstractMediator mediator;
    //構造器初始化中介者
    public AbstractColleague(AbstractMediator _mediator){
        this.mediator = _mediator;
    }   
    //三個國家需要實現的方法
    public abstract void increase() throws Exception;
    public abstract void decrease();
    public abstract void getStrength();
    public abstract void reset() throws Exception;
}
package com.csdn;
/**
 * 魏國
 * @author Administrator
 *
 */
public class Wei extends AbstractColleague{
    //將魏國和中介者連結
    public Wei(AbstractMediator _mediator) {
        super(_mediator);
    }
    //魏國實力
    private static int WEI_STRENGTH = 10;
    //魏國實力增長
    @Override
    public void increase() throws Exception{
        WEI_STRENGTH += 1;
        System.out.println("魏國實力增長到:"+WEI_STRENGTH);
        super.mediator.execute("weiIncrease");
    }
    //魏國實力下降
    @Override
    public void decrease(){
        WEI_STRENGTH -= 1;
        System.out.println("魏國實力減弱到:"+WEI_STRENGTH);
    }
    //顯示魏國實力
    @Override
    public void getStrength(){
        System.out.println("魏國實力為:"+WEI_STRENGTH);
    }
    //魏國求和
    @Override
    public void reset() throws Exception{
        System.out.println("魏國實力為:"+WEI_STRENGTH);
        super.mediator.execute("weiForPeace");
    }
}
package com.csdn;
/**
 * 蜀國
 * @author Administrator
 *
 */
public class Shu extends AbstractColleague{
    //將蜀國和中介者連結
    public Shu(AbstractMediator _mediator) {
        super(_mediator);
    }
    //蜀國實力
    private static int SHU_STRENGTH = 10;
    //蜀國實力增長
    @Override
    public void increase() throws Exception{
        SHU_STRENGTH += 1;
        System.out.println("蜀國實力增長到:"+SHU_STRENGTH);
        super.mediator.execute("shuIncrease");
    }
    //蜀國實力下降
    @Override
    public void decrease(){
        SHU_STRENGTH -= 1;
        System.out.println("蜀國實力減弱到:"+SHU_STRENGTH);
    }
    //顯示蜀國實力
    @Override
    public void getStrength(){
        System.out.println("蜀國實力為:"+SHU_STRENGTH);
    }
    //蜀國求和
    @Override
    public void reset() throws Exception{
        System.out.println("蜀國實力為:"+SHU_STRENGTH);
        super.mediator.execute("shuForPeace");
    }
}
package com.csdn;
/**
 * 吳國
 * @author Administrator
 *
 */
public class Wu extends AbstractColleague{
    //將吳國和中介者連結
    public Wu(AbstractMediator _mediator) {
        super(_mediator);
        // TODO Auto-generated constructor stub
    }
    //吳國實力
    private static int WU_STRENGTH = 10;
    //吳國實力增長
    @Override
    public void increase() throws Exception{
        WU_STRENGTH += 1;
        System.out.println("吳國實力增長到:"+WU_STRENGTH);
        super.mediator.execute("wuIncrease");
    }
    //吳國實力下降
    @Override
    public void decrease(){
        WU_STRENGTH -= 1;
        System.out.println("吳國實力減弱到:"+WU_STRENGTH);
    }
    //顯示吳國實力
    @Override
    public void getStrength(){
        System.out.println("吳國實力為:"+WU_STRENGTH);
    }
    //吳國求和
    @Override
    public void reset() throws Exception{
        System.out.println("吳國實力為:"+WU_STRENGTH);
        super.mediator.execute("wuForPeace");
    }
}
package com.csdn;
/**
 * 模擬戰場
 * @author Administrator
 *
 */
public class Battlefield {
    public static void main(String[] args) throws Exception{
        //建立中介者及三國實體物件
        AbstractMediator mediator = new Mediator();
        Wei wei = new Wei(mediator);
        Shu shu = new Shu(mediator);
        Wu wu = new Wu(mediator);
        /*輸出:
        魏國實力增長到:11
        蜀國實力減弱到:9
        吳國實力減弱到:9*/
        wei.increase();
        /*輸出:
        吳國實力增長到:10
        魏國實力減弱到:10
        蜀國實力減弱到:8*/
        wu.increase();
        /*輸出:
        蜀國實力為:8
        蜀國求和,三國實力重置!
        魏國實力恢復成功!實力為:10
        蜀國實力恢復成功!實力為:10
        吳國實力恢復成功!實力為:10*/
        shu.reset();
        /*輸出:
        蜀國實力增長到:11
        魏國實力減弱到:9
        吳國實力減弱到:9*/
        shu.increase();     
    }
}

注:
a:該示例在程式碼實現方面還可以進行部分優化
b:同事類必須有中介者,而中介者可以只有部分同事類
c:同事類的行為分為兩種,一種是同事本身的行為,用來改變自身狀態,處理自身行為,與其他的同事類和中介者沒有任何依賴,這種行為叫自發行為。還有一種是必須依賴中介者才能完成的行為,叫依賴方法
d:通常中介者模式中的同事類是協作關係,處理不同的業務。如果兩個物件不能提煉出共性,那就不要去刻意追求兩者的抽象,抽象只要去定義出模式需要的角色即可,根據專案實際情況而定(本示例為了展示的更加清晰,在同事類業務區分這方面可能不太恰當,三國相比於是同事類可能更像兄弟類)

2.中介者模式通用模型程式碼實現:

package com.csdn;
/**
 * 通用抽象中介者
 * @author Administrator
 *
 */
public abstract class Mediator {
    //定義同事類
    protected ConcreteColleague1 c1;
    protected ConcreteColleague2 c2;
    //通過getter/setter方法把同事類注入過來
    public ConcreteColleague1 getC1() {
        return c1;
    }
    public void setC1(ConcreteColleague1 c1) {
        this.c1 = c1;
    }
    public ConcreteColleague2 getC2() {
        return c2;
    }
    public void setC2(ConcreteColleague2 c2) {
        this.c2 = c2;
    }
    //中介者模式的業務邏輯
    public abstract void doSomething1();
    public abstract void doSomething2();
}
package com.csdn;
/**
 * 通用中介者
 * @author Administrator
 *
 */
public class ConcreteMediator extends Mediator{
    @Override
    public void doSomething1() {
        //呼叫同事類的方法,只要是public的都可以呼叫
        super.c1.selfMethod1();
        super.c2.selfMethod2();
    }
    @Override
    public void doSomething2() {
        super.c1.selfMethod1();
        super.c2.selfMethod2();
    }
}
package com.csdn;
/**
 * 抽象同事類
 * @author Administrator
 *
 */
public abstract class Colleague {
    protected Mediator mediator;
    public Colleague(Mediator _mediator){
        this.mediator = _mediator;
    }
}
package com.csdn;
/**
 * 具體同事類
 * @author Administrator
 *
 */
public class ConcreteColleague1 extends Colleague{
    //通過建構函式傳遞給中介者
    public ConcreteColleague1(Mediator _mediator) {
        super(_mediator);
    }
    public void selfMethod1(){
        //自己的業務邏輯
    }
    public void depMethod1(){
        //自己的業務邏輯
        //自己處理不了的業務邏輯,給中介者處理
        super.mediator.doSomething1();
    }
}
package com.csdn;
/**
 * 具體同事類
 * @author Administrator
 *
 */
public class ConcreteColleague2 extends Colleague{
    //通過建構函式傳遞給中介者
    public ConcreteColleague2(Mediator _mediator) {
        super(_mediator);
    }
    public void selfMethod2(){
        //自己的業務邏輯
    }
    public void depMethod2(){
        //自己的業務邏輯
        //自己處理不了的業務邏輯,給中介者處理
        super.mediator.doSomething2();
    }
}