<>中介者模式
中介者模式,又称仲裁者模式,用于调整多个对象之间的关系。
<>角色
* 抽象仲裁者(Mediator)
定义接口,用于各同事间的通信。
* 具体仲裁者(ConcreteMediator)
维持了对各个同事对象的引用,通过协调各个同事对象来实现协作行为。
* 抽象同事(Colleague)
定义各个同事类公有的方法,并声明了一些抽象方法来供子类实现。
* 具体同事类(ConcreteColleague)
维持了一个对抽象中介者类的引用,通过中介者来间接完成与其他同事类的通信。
<>案例
<>登录框
登录框有两个控件:输入框和登录按钮。仅当输入有效内容(非空)后,登录按钮才有效,并且登陆后输入框自动清空。
Colleague: 抽象同事
public interface Colleague { public void setMediator(Mediator mediator); //
绑定老大 public void setColleagueEnabled(boolean enabled); // 设置禁用&可用 }
InputBox: 具体同事:输入框
public class InputBox implements Colleague{ private Mediator mediator; private
String content; private boolean enabled; public InputBox() { this.enabled = true
; } @Override public void setMediator(Mediator mediator) { this.mediator =
mediator; } public void setContent(String content) { if (this.enabled){ System.
out.printf("输入账号信息: %s\n", content); this.content = content.trim(); // 告诉仲裁者自己变了
this.mediator.colleagueChanged(this); } } public void clear() { this.content =
""; this.mediator.colleagueChanged(this); } public String getContent() { return
this.content; } @Override public void setColleagueEnabled(boolean enabled) {
this.enabled = enabled; } }
LoginBtn: 具体同事:登录按钮
public class LoginBtn implements Colleague{ private Mediator mediator; private
boolean enabled; public LoginBtn() { this.enabled = false; } @Override public
void setMediator(Mediator mediator) { this.mediator = mediator; } @Override
public void setColleagueEnabled(boolean enabled) { this.enabled = enabled; }
public void click(){ if (enabled==true){ System.out.println("成功登录"); this.
mediator.colleagueChanged(this); } else { System.out.println("登录禁用"); } } }
Mediator: 抽象仲裁者
public interface Mediator { public void colleagueChanged(Colleague colleague);
}
ConcreteMediator: 具体仲裁者
public class ConcreteMediator implements Mediator{ private InputBox inputBox;
private LoginBtn loginBtn; public ConcreteMediator setInputBox(InputBox inputBox
) { this.inputBox = inputBox; inputBox.setMediator(this); return this; } public
ConcreteMediator setLoginBtn(LoginBtn loginBtn) { this.loginBtn = loginBtn;
loginBtn.setMediator(this); return this; } @Override public void
colleagueChanged(Colleague colleague) { if (colleague.equals(inputBox)){ //
判断有内容没 if (inputBox.getContent().length()==0){ this.loginBtn.setColleagueEnabled
(false); } else { this.loginBtn.setColleagueEnabled(true); } } if (colleague.
equals(loginBtn)){ inputBox.ckear(); //设置登录后清空 } } }
Main:
public class Main { public static void main(String[] args) { InputBox inputBox
= new InputBox(); LoginBtn loginBtn = new LoginBtn(); ConcreteMediator mediator
= new ConcreteMediator() .setInputBox(inputBox) .setLoginBtn(loginBtn); loginBtn
.click(); inputBox.setContent("root"); loginBtn.click(); loginBtn.click(); } }
Output:
登录禁用 输入账号信息: root 成功登录 登录禁用
<>中介者模式的优缺点
优点:
* 简化了对象之间的交互
* 将各同事对象解耦,可以独立地改变和复用每个同事和中介者,增加新的中介和同事很方便,符合开闭原则。
* 可以减少大量同事子类的生成,改变同事行为只需要生成新的中介者子类即可。
缺点:
* 具体中介者子类中包含了大量的同事之间的交互细节,可能会导致具体中介者类非常复杂,使得系统难以维护。
<>应用场景
* 系统中对象之间存在复杂的引用关系 => 系统结构混乱且难以理解
* 一个对象由于引用了其他很多对象并且直接和这些对象通信 => 难以复用该对象
* 想要通过一个中间类来封装多个类的行为又不想生成太多子类 => 引入中介者即可实现