詳解JAVA面向對象的設計模式 (五)、中介者模式

中介者模式(調停模式) Mediator

模式的定義與特色

中介者(Mediator)模式的定義:定義一箇中介對象來封裝一系列對象之間的交互,使原有對象之間的耦合鬆散,且能夠獨立地改變它們之間的交互。中介者模式又叫調停模式,它是迪米特法則的典型應用。java

中介者模式是一種對象行爲型模式,其主要優勢以下。ide

  1. 下降了對象之間的耦合性,使得對象易於獨立地被複用。
  2. 將對象間的一對多關聯轉變爲一對一的關聯,提升系統的靈活性,使得系統易於維護和擴展。

其主要缺點是:當同事類太多時,中介者的職責將很大,它會變得複雜而龐大,以致於系統難以維護。測試

模式的結構與實現

中介者模式實現的關鍵是找出「中介者」,下面對它的結構和實現進行分析。this

模式的結構

中介者模式包含如下主要角色。code

  1. 抽象中介者(Mediator)角色:它是中介者的接口,提供了同事對象註冊與轉發同事對象信息的抽象方法。
  2. 具體中介者(ConcreteMediator)角色:實現中介者接口,定義一個 List 來管理同事對象,協調各個同事角色之間的交互關係,所以它依賴於同事角色。
  3. 抽象同事類(Colleague)角色:定義同事類的接口,保存中介者對象,提供同事對象交互的抽象方法,實現全部相互影響的同事類的公共功能。
  4. 具體同事類(Concrete Colleague)角色:是抽象同事類的實現者,當須要與其餘同事對象交互時,由中介者對象負責後續的交互。

中介者模式的結構圖

實現例子

既然是中介者模式,咱們就寫一個租房中介的例子。對象

  • 租房中介即中介者
  • 來自不一樣省份的準租客即同事
  • 某省份的準租客發送已認租信息後,中介者轉發給全部註冊的準租客
  • 全部準租客收到已出租信息
// 抽象中介
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();
    }

/**
輸出:
廣東租客發送認租信息!
租房中介告知四川準租戶:房子已經出租給廣東租客
租房中介告知江西準租戶:房子已經出租給廣東租客
*/
相關文章
相關標籤/搜索