漫說中介者模式--創業公司成長記

  1. 中介者進化

一個公司,開始時你們都是平等關係的,例如ABC三人。html

開始,公司很小,他們都是多面手,每一個人既作生產,也作銷售,也作運輸。java

以下圖所示:編程

漫說中介者模式--創業公司成長記

隨着生意愈來愈好,公司規模變大,而後他們就發現這樣工做的話,要麼生產跟不上,要麼銷售跟不上,要麼運輸跟不上。ide

他們發現了問題,所以他們決定改變現狀,每一個人專攻一個,要麼生成,要麼銷售,要麼運輸,那麼他們就變成了以下圖所示的狀態:
漫說中介者模式--創業公司成長記this

市場愈來愈大,公司也愈來愈大,在公司要搶佔儘量多的市場份額時發現他們要頻繁的相互協調溝通,這耗費了他們大量的時間和精力,因而他們引入了外援。3d

漫說中介者模式--創業公司成長記

此時,他們能夠放心的各司其職,剩下的工做就交給M來處理。M就是中介者模式的中介。code

上面的例子也許咱們以爲理清楚他們之間的關係是件很簡單的事情,不須要請外援。那麼若是人數不只限於3我的的狀況,又如何呢?htm

漫說中介者模式--創業公司成長記

你是否還有足夠的自信能理清楚各自的職責呢?若是還能夠的話,超過個位數達到幾十上百的時候又如何呢?對象

請看這樣是否更簡單呢?blog

漫說中介者模式--創業公司成長記

固然,若是對象數量達到必定級別時,更適合層狀樹組織就不在咱們的考慮內了。

  1. 中介者模式結構圖:

    中介者模式:用一箇中介對象來封裝一系列的對象交互,中介者使各對象不須要顯式地相互引用,從而使其耦合鬆散,並且能夠獨立地改變它們之間的交互。
    漫說中介者模式--創業公司成長記

實例代碼:

/**
*Mediator Interface
*/
package com.journaldev.design.mediator;

public interface ChatMediator {

    public void sendMessage(String msg, User user);

    void addUser(User user);
}

/**
*Colleague Interface
*/
package com.journaldev.design.mediator;

public abstract class User {
    protected ChatMediator mediator;
    protected String name;

    public User(ChatMediator med, String name){
        this.mediator=med;
        this.name=name;
    }

    public abstract void send(String msg);

    public abstract void receive(String msg);
}

/**
*Concrete Mediator
*/
package com.journaldev.design.mediator;

import java.util.ArrayList;
import java.util.List;

public class ChatMediatorImpl implements ChatMediator {

    private List<User> users;

    public ChatMediatorImpl(){
        this.users=new ArrayList<>();
    }

    @Override
    public void addUser(User user){
        this.users.add(user);
    }

    @Override
    public void sendMessage(String msg, User user) {
        for(User u : this.users){
            //message should not be received by the user sending it
            if(u != user){
                u.receive(msg);
            }
        }
    }

}

/**
*Concrete Colleague
*/
package com.journaldev.design.mediator;

public class UserImpl extends User {

    public UserImpl(ChatMediator med, String name) {
        super(med, name);
    }

    @Override
    public void send(String msg){
        System.out.println(this.name+": Sending Message="+msg);
        mediator.sendMessage(msg, this);
    }
    @Override
    public void receive(String msg) {
        System.out.println(this.name+": Received Message:"+msg);
    }

}

/**
*Mediator Pattern Client
*/
package com.journaldev.design.mediator;

public class ChatClient {

    public static void main(String[] args) {
        ChatMediator mediator = new ChatMediatorImpl();
        User user1 = new UserImpl(mediator, "Pankaj");
        User user2 = new UserImpl(mediator, "Lisa");
        User user3 = new UserImpl(mediator, "Saurabh");
        User user4 = new UserImpl(mediator, "David");
        mediator.addUser(user1);
        mediator.addUser(user2);
        mediator.addUser(user3);
        mediator.addUser(user4);

        user1.send("Hi All");

    }

}

3.優缺點和使用場景

中介者模式的優勢

適當地使用中介者模式能夠避免同事類之間的過分耦合,使得各同事類之間能夠相對獨立地使用。
使用中介者模式能夠將對象間一對多的關聯轉變爲一對一的關聯,使對象間的關係易於理解和維護。
使用中介者模式能夠將對象的行爲和協做進行抽象,可以比較靈活的處理對象間的相互做用。

適用場景

在面向對象編程中,一個類必然會與其餘的類發生依賴關係,徹底獨立的類是沒有意義的。一個類同時依賴多個類的狀況也至關廣泛,既然存在這樣的狀況,說明,一對多的依賴關係有它的合理性,適當的使用中介者模式能夠使本來凌亂的對象關係清晰,可是若是濫用,則可能會帶來反的效果。通常來講,只有對於那種同事類之間是網狀結構的關係,纔會考慮使用中介者模式。能夠將網狀結構變爲星狀結構,使同事類之間的關係變的清晰一些。

中介者模式是一種比較經常使用的模式,也是一種比較容易被濫用的模式。對於大多數的狀況,同事類之間的關係不會複雜到混亂不堪的網狀結構,所以,大多數狀況下,將對象間的依賴關係封裝的同事類內部就能夠的,沒有必要非引入中介者模式。濫用中介者模式,只會讓事情變的更復雜。

參考:1. http://www.cnblogs.com/hzcxy/archive/2013/03/08/2949533.html

2.http://hi.baidu.com/quakeii/item/c8b6b2e9c7d6ca236dabb8c4

    3. http://www.journaldev.com/1730/mediator-design-pattern-in-java-example-tutorial
相關文章
相關標籤/搜索