定義
中介者模式包裝了一系列對象相互作用的方式,使得這些對象不必相互明顯作用。從而可以使他們可以鬆散耦合。當某些對象之間的作用發生改變時,不會立即影響其他的一些對象之間的作用。從而保證這些作用可以彼此獨立變化。中介者模式將多對多的相互作用轉化爲一對多的相互作用。中介者模式將對象的行爲和協作抽象化,把對象在小尺度的行爲上與其他對象的相互作用分開處理。
使用場景
當對象之間的交互操作很多且每個對象的行爲操作都彼此依賴時,爲防止在修改一個對象的行爲時,同時涉及修改很多其他對象的行爲,可採用中介者模式來解決緊耦合問題。該模式將對象之間的多對多關係變成一對多關係,中介者對象將系統從網狀結構變成以調停者爲中心的星形結構,達到降低系統的複雜性,提高可擴展性的作用。
關鍵點
抽象中介者角色,定義一個抽象接口方法,具體的事物類通過該方法來通知中介者自身的狀態改變
具體中介者角色,繼承於抽象中介者,從具體事物對象接受消息,向具體的事物發出命令
抽象事物角色,定義了中介者對象的接口,只知道中介者,不知道其他的事物對象
具體事物角色,繼承於抽象事物角色,每個具體的事物類都知道本身在小範圍內的行爲,但不知道它在大範圍內的角色
實現
/**
* 抽象中介者
*/
public abstract class AbsMediator {
public abstract void change(AbsRole role);
}
/**
* 抽象事物角色_持有抽象中介者引用
*/
public abstract class AbsRole {
protected AbsMediator mediator;
public AbsRole(AbsMediator absMediator) {
this.mediator = absMediator;
}
}
/**
* 具體中介者_持有互相關聯的具體事物對象
*/
public class ConcreteMediaor extends AbsMediator {
private RoleA roleA;
private RoleB roleB;
@Override
public void change(AbsRole role) {
if (role == roleA) {
//在這裏進行roleA改變時其他數據的改變操作
} else if (role == roleB) {
//在這裏進行roleB改變時其他數據的改變操作
}
}
/**
* 注入具體事物A
*/
public void setRoleA(RoleA roleA) {
this.roleA = roleA;
}
/**
* 注入具體事物B
*/
public void setRoleB(RoleB roleB) {
this.roleB = roleB;
}
}
/**
* 具體事物A
*/
public class RoleA extends AbsRole {
public RoleA(AbsMediator absMediator) {
super(absMediator);
}
/**
* 具體事物A變化_通知中介者改變其他相關事物
*/
public void changeRoleA() {
mediator.change(this);
}
}
/**
* 具體事物B
*/
public class RoleB extends AbsRole {
public RoleB(AbsMediator absMediator) {
super(absMediator);
}
/**
* 具體事物B變化_通知中介者改變其他相關事物
*/
public void changeRoleA() {
mediator.change(this);
}
}
使用
ConcreteMediator mediator = new ConcreteMediator();
//創建具體事物,並與中介者關聯
RoleA roleA = new RoleA(mediator);
RoleB roleB = new RoleB(mediator);
//將事物注入到中介者
mediator.setRoleA(roleA);
mediator.setRoleB(roleB);
//假設事物B改變
roleB.changeRoleB();
小結
優點
對複雜的依賴關係進行解耦,從而邏輯結構變得清晰,維護性和擴展性極高
缺點
類數量增多