中介者模式(調停模式) Mediator
模式的定義與特點
中介者(Mediator)模式的定義:定義一個中介物件來封裝一系列物件之間的互動,使原有物件之間的耦合松散,且可以獨立地改變它們之間的互動,中介者模式又叫調停模式,它是迪米特法則的典型應用,
中介者模式是一種物件行為型模式,其主要優點如下,
- 降低了物件之間的耦合性,使得物件易于獨立地被復用,
- 將物件間的一對多關聯轉變為一對一的關聯,提高系統的靈活性,使得系統易于維護和擴展,
其主要缺點是:當同事類太多時,中介者的職責將很大,它會變得復雜而龐大,以至于系統難以維護,
模式的結構與實作
中介者模式實作的關鍵是找出“中介者”,下面對它的結構和實作進行分析,
模式的結構
中介者模式包含以下主要角色,
- 抽象中介者(Mediator)角色:它是中介者的介面,提供了同事物件注冊與轉發同事物件資訊的抽象方法,
- 具體中介者(ConcreteMediator)角色:實作中介者介面,定義一個 List 來管理同事物件,協調各個同事角色之間的互動關系,因此它依賴于同事角色,
- 抽象同事類(Colleague)角色:定義同事類的介面,保存中介者物件,提供同事物件互動的抽象方法,實作所有相互影響的同事類的公共功能,
- 具體同事類(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);
}
具體類
// 具體中介
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();
}
/**
輸出:
廣東租客發送認租資訊!
租房中介告知四川準租戶:房子已經出租給廣東租客
租房中介告知江西準租戶:房子已經出租給廣東租客
*/
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/106644.html
標籤:其他
上一篇:spring cloud springboot 框架原始碼 flowable作業流 前后分離
下一篇:如何理解多租戶架構?(轉)
