中介者模式定義:用一箇中介對象來封裝一系列的對象交互,中介者使各對象不須要顯式地相互引用,從而使其耦合鬆散,並且能夠獨立地改變它們之間的交互。中介者模式又稱爲調停者模式,它是一種對象行爲型模式。java
中介者模式針對的問題是,解決一系列對象之間複雜的耦合關係,這一系列對象每每是「多對多」的耦合關係,中介者模式採用一箇中介者對象將這一系列對象集中管理,而各個對象也將本身與其它對象的交互行爲委託給中介者處理,從而減小這一系列對象之間的耦合。ide
中介者模式包含如下主要角色:測試
抽象中介者(Mediator)角色:它是中介者的接口,提供了同事對象註冊與轉發同事對象信息的抽象方法。this
具體中介者(ConcreteMediator)角色:實現中介者接口,定義一個 List 來管理同事對象,協調各個同事角色之間的交互關係,所以它依賴於同事角色。spa
抽象同事類(Colleague)角色:定義同事類的接口,保存中介者對象,提供同事對象交互的抽象方法,實現全部相互影響的同事類的公共功能。3d
具體同事類(Concrete Colleague)角色:是抽象同事類的實現者,當須要與其餘同事對象交互時,由中介者對象負責後續的交互。code
類圖以下:對象
下面咱們就以房地產中介舉個例子,首先是一箇中介接口,有兩個方法:註冊用戶和轉發消息,而後有具體的中介者,它維護一個用戶列表,再者就是抽象的用戶類,持有一箇中介者對象,同時提供兩個抽象方法接收和發送供子類實現,最後就是具體的用戶類。blog
package mediator; public interface Mediator { void register(Customer cu); void relay(Customer cu,String msg); }
package mediator; import java.util.ArrayList; import java.util.List; public class ConcreteMediator implements Mediator { private List<Customer> list = new ArrayList<Customer>(); @Override public void register(Customer cu) { if(!list.contains(cu)) { list.add(cu); cu.setMedium(this); } } @Override public void relay(Customer cu,String msg) { for (Customer customer : list) { if(!customer.equals(cu)) { customer.receive(cu, msg); } } } }
package mediator; public abstract class Customer { protected Mediator mediator; protected String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public Customer(String name) { super(); this.name = name; } public void setMedium(Mediator mediator) { this.mediator=mediator; } public abstract void receive(Customer cu,String msg); public abstract void send(Customer cu,String msg); }
package mediator; public class ConcreteCustomer extends Customer { public ConcreteCustomer(String name) { super(name); } @Override public void receive(Customer cu, String msg) { System.out.println(name + "收到消息:" + cu.getName() + "說" + msg); } @Override public void send(Customer cu, String msg) { System.out.println(name + "發佈消息說:"+ msg); mediator.relay(cu, msg); } }
運行測試代碼接口
從demo中能夠看出經過中介者,買房和賣房實現了溝通,但雙方乃至多方並不耦合,張三不須要爲了告訴李四他要賣房而持有一個李四的對象。
中介者模式是一種對象行爲型模式,其主要優勢以下:下降了對象之間的耦合性,使得對象易於獨立地被複用;將對象間的一對多關聯轉變爲一對一的關聯,提升系統的靈活性,使得系統易於維護和擴展。其主要缺點是:當同事類太多時,中介者的職責將很大,它會變得複雜而龐大,以致於系統難以維護。
中介者模式適用於如下場景:
當對象之間存在複雜的網狀結構關係而致使依賴關係混亂且難以複用時。
當想建立一個運行於多個類之間的對象,又不想生成新的子類時。
在實際開發中,一般採用如下兩種方法來簡化中介者模式,使開發變得更簡單:
不定義中介者接口,把具體中介者對象實現成爲單例。
同時對象不持有中介者,而是在須要的時直接獲取中介者對象並調用。