設計模式--中介者模式

Java工程源碼

類圖

這裏寫圖片描述


定義
用一箇中介對象封裝一系列的對象交互,中介者使各對象不需要顯示地相互作用,從而使其耦合鬆散,而且可以獨立地改變它們之間的交互

優點
- 減少類間的依賴,把原有的一對多的依賴變成了一對一的依賴,降低了類間耦合性

使用場景
適用於對象之間緊密耦合的情況。實際中的應用如MVC框架(Struts(Controller)就是一箇中介者,
它把M和V隔離開,協調M和V協同工作,減小M和V的依賴關係)。媒體網關,如MSN服務器(QQ)就是一箇中轉站,
而飛鴿(IPMsg)直接使用UDP廣播方式,就沒使用中介者


抽象同事類

public abstract class Colleague {
    protected Mediator mediator;

    public Colleague(Mediator _mediator) {
        this.mediator = _mediator;
    }
}

具體同事類1

public class ConcreteColleague1 extends Colleague {
    // 通過構造方法傳遞中介者
    public ConcreteColleague1(Mediator _mediator) {
        super(_mediator);
    }

    // 自有方法
    public void selfMethod() {
        System.out.println("同事1執行方法");
    }

    // 依賴方法,依賴中介者
    public void depMethod() {
        System.out.println("同事1找到中介者,讓中介者找同事2->");
        // 自己不能處理的邏輯委託給中介者
        super.mediator.doSomething2();
    }
}

具體同事類2

public class ConcreteColleague2 extends Colleague {
    // 通過構造方法傳遞中介者
    public ConcreteColleague2(Mediator _mediator) {
        super(_mediator);
    }

    // 自有方法
    public void selfMethod() {
        System.out.println("同事2執行方法");
    }

    // 依賴方法,依賴中介者
    public void depMethod() {
        System.out.println("同事2找到中介者,讓中介者找同事1->");
        // 自己不能處理的邏輯委託給中介者
        super.mediator.doSomething1();
    }
}

抽象中介者

public abstract class Mediator {
    // 定義同事類
    private ConcreteColleague1 c1;
    private ConcreteColleague2 c2;

    // 注入同事類
    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();
}

具體中介者

public class ConcreteMediator extends Mediator {

    @Override
    public void doSomething1() {
        // 調用同事類的方法
        System.out.print("中介者找到同事1->");
        super.getC1().selfMethod();
    }

    @Override
    public void doSomething2() {
        System.out.print("中介者找到同事2->");
        super.getC2().selfMethod();
    }
}

場景類

public class Client {
    public static void main(String[] args) {
        // 中介者
        ConcreteMediator mediator = new ConcreteMediator();
        // 同事1
        ConcreteColleague1 c1 = new ConcreteColleague1(mediator);
        // 同事2
        ConcreteColleague2 c2 = new ConcreteColleague2(mediator);
        // 中介者可以找到同事1和同事2
        mediator.setC1(c1);
        mediator.setC2(c2);

        c1.selfMethod();
        // 同事1去找中介者
        c1.depMethod();
        c2.selfMethod();
        // 同事2去找中介者
        c2.depMethod();
    }
}

運行結果

同事1執行方法
同事1找到中介者,讓中介者找同事2->
中介者找到同事2->同事2執行方法
同事2執行方法
同事2找到中介者,讓中介者找同事1->
中介者找到同事1->同事1執行方法
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章