中介者(Mediator)模式的定義:定義一箇中介對象來封裝一系列對象之間的交互,使原有對象之間的耦合鬆散,且能夠獨立地改變它們之間的交互。中介者模式又叫調停模式,它是迪米特法則的典型應用。java
中介者模式是一種對象行爲型模式,其主要優勢以下。ide
其主要缺點是:當同事類太多時,中介者的職責將很大,它會變得複雜而龐大,以致於系統難以維護。測試
中介者模式實現的關鍵是找出「中介者」,下面對它的結構和實現進行分析。this
中介者模式包含如下主要角色。code
既然是中介者模式,咱們就寫一個租房中介的例子。對象
// 抽象中介 public abstract class AbstractMediator { public abstract void relay(AbstractTenant tenant); public abstract void register(AbstractTenant tenant); } // 抽象租客 public abstract class AbstractTenant { // 來自哪一個省 protected String province; // 指向的中介 protected AbstractMediator mediator; public void setMediator(AbstractMediator mediator) { this.mediator = mediator; } public abstract void send(); public abstract void receive(String msg); }
具體類blog
// 具體中介 public class Mediator extends AbstractMediator { List<AbstractTenant> tenants = new ArrayList<>(); @Override public void relay(AbstractTenant sender) { for (AbstractTenant t : tenants){ if (t.equals(sender)) { continue; } t.receive("房子已經出租給" + sender.province + "租客"); } } @Override public void register(AbstractTenant tenant) { if (!tenants.contains(tenant)) { tenants.add(tenant); tenant.setMediator(this); } } } // 具體租客(廣東,四川,江西) public class GuangdongTenant extends AbstractTenant { public GuangdongTenant() { province = "廣東"; } @Override public void send() { System.out.println(province + "租客發送認租信息!"); mediator.relay(this); } @Override public void receive(String msg) { System.out.println("租房中介告知" + province + "準租戶:" + msg); } } // 四川 public class SichuanTenant extends AbstractTenant { public SichuanTenant() { province = "四川"; } @Override public void send() { System.out.println(province + "租客發送認租信息!"); mediator.relay(this); } @Override public void receive(String msg) { System.out.println("租房中介告知" + province + "準租戶:" + msg); } } //江西 public class JiangxiTenant extends AbstractTenant { public JiangxiTenant() { province = "江西"; } @Override public void send() { System.out.println(province + "租客發送認租信息!"); mediator.relay(this); } @Override public void receive(String msg) { System.out.println("租房中介告知" + province + "準租戶:" + msg); } }
因爲例子的業務內容很簡單,因此具體的send receive實現都同樣,實際開發中能夠靈活重寫這2個方法。接口
測試一下開發
public static void main(String[] args) { AbstractTenant guangdongTenant = new GuangdongTenant(); AbstractTenant sichuanTenant = new SichuanTenant(); AbstractTenant abstractTenant = new JiangxiTenant(); AbstractMediator mediator = new Mediator(); mediator.register(guangdongTenant); mediator.register(sichuanTenant); mediator.register(abstractTenant); guangdongTenant.send(); } /** 輸出: 廣東租客發送認租信息! 租房中介告知四川準租戶:房子已經出租給廣東租客 租房中介告知江西準租戶:房子已經出租給廣東租客 */