中介者模式(Mediator)
1.意圖
用一箇中介對象來封裝一系列的對象交互。中介者使各對象不需要顯式地相互引用,從而使其耦合鬆散,而且可以獨立地改變它們之間的交互。
在下列情況下使用中介者模式 :
• 一組對象以定義良好但是複雜的方式進行通信。產生的相互依賴關係結構混亂且難以理解。
• 一個對象引用其他很多對象並且直接與這些對象通信 ,導致難以複用該對象。
• 想定製一個分佈在多個類中的行爲,而又不想生成太多的子類。
2.特點
• Mediator(中介者 )
— 中介者定義一個接口用於與各同事(Colleague)對象通信。
• ConcreteMediator(具體中介者)
— 具體中介者通過協調各同事對象實現協作行爲。
— 瞭解並維護它的各個同事。
• Colleague class(同事類)
— 每一個同事類都知道它的中介者對象。
— 每一個同事對象在需與其他的同事通信的時候,與它的中介者通信。
同事向一箇中介者對象發送和接收請求。中介者在各同事間適當地轉發請求以實現協作行爲。
3.UML類圖
4.代碼
/**
* Mediator(中介者 )
— 中介者定義一個接口用於與各同事(Colleague)對象通信。
*/
public interface Mediator {
void contact(String message,Colleague coll);
}
/**
* ConcreteMediator(具體中介者)
— 具體中介者通過協調各同事對象實現協作行爲。
— 瞭解並維護它的各個同事。
*/
public class ConcreteMediator implements Mediator {
private List<Colleague> list = new ArrayList<Colleague>();
public void addColleague(Colleague colleague){
list.add(colleague);
}
/**
* 中介者聯繫具體的同事類.將消息發送給同事類
* @param message
* @param coll
*/
@Override
public void contact(String message, Colleague coll) {
for(Colleague colleague:list){
if(colleague!=coll)
colleague.getMessage(message);
}
}
}
/**
* 抽象同事類
* 每個同事類必須持有自己的中介者.
*/
public abstract class Colleague {
protected String name;
protected Mediator mediator;
public Colleague(String name, Mediator mediator) {
this.name = name;
this.mediator = mediator;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public abstract void getMessage(String message);
public abstract void contact(String message);
}
/**
* Colleague class(同事類)
— 每一個同事類都知道它的中介者對象。
— 每一個同事對象在需與其他的同事通信的時候,與它的中介者通信。
*/
public class ColleagueA extends Colleague {
public ColleagueA(String name, Mediator mediator) {
super(name, mediator);
}
/**
* 得到中介者的消息
* @param message
*/
public void getMessage(String message){
System.out.println("同事-"+name+"收到消息:"+message);
}
/**
* 通過中介者發佈消息
* @param message
*/
public void contact(String message){
mediator.contact(message,this);
}
}
public class MediatorTest {
public static void main(String[] args) {
ConcreteMediator mediator = new ConcreteMediator();
Colleague colleaguea = new ColleagueA("A",mediator);
Colleague colleagueb = new ColleagueA("B",mediator);
Colleague colleaguec = new ColleagueA("C",mediator);
mediator.addColleague(colleaguea);
mediator.addColleague(colleagueb);
mediator.addColleague(colleaguec);
colleaguea.contact("吃飯了");
colleagueb.contact("今天吃什麼?");
colleaguec.contact("肯德基吧.");
colleaguea.contact("好啊.");
colleagueb.contact("行");
}
}