一個公司,開始時你們都是平等關係的,例如ABC三人。html
開始,公司很小,他們都是多面手,每一個人既作生產,也作銷售,也作運輸。java
以下圖所示:編程
隨着生意愈來愈好,公司規模變大,而後他們就發現這樣工做的話,要麼生產跟不上,要麼銷售跟不上,要麼運輸跟不上。ide
他們發現了問題,所以他們決定改變現狀,每一個人專攻一個,要麼生成,要麼銷售,要麼運輸,那麼他們就變成了以下圖所示的狀態:this
市場愈來愈大,公司也愈來愈大,在公司要搶佔儘量多的市場份額時發現他們要頻繁的相互協調溝通,這耗費了他們大量的時間和精力,因而他們引入了外援。3d
此時,他們能夠放心的各司其職,剩下的工做就交給M來處理。M就是中介者模式的中介。code
上面的例子也許咱們以爲理清楚他們之間的關係是件很簡單的事情,不須要請外援。那麼若是人數不只限於3我的的狀況,又如何呢?htm
你是否還有足夠的自信能理清楚各自的職責呢?若是還能夠的話,超過個位數達到幾十上百的時候又如何呢?對象
請看這樣是否更簡單呢?blog
固然,若是對象數量達到必定級別時,更適合層狀樹組織就不在咱們的考慮內了。
中介者模式結構圖:
中介者模式:用一箇中介對象來封裝一系列的對象交互,中介者使各對象不須要顯式地相互引用,從而使其耦合鬆散,並且能夠獨立地改變它們之間的交互。
實例代碼:
/** *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