學了這麼多的設計模式,離真正的實際運用還有很長的路要走,理論是理論,理論結合實踐才有用。今天繼續吧,繼續一個學習一個新的設計模式——中介者模式。
中介在現實生活中非常常見,比如你要租一個房子,可能你不會和房東直接接觸而是通過中介來完成一系列繁瑣的過程。中介者模式就是這樣的存在,如果一個類需要調用另一個類的某一個方法的話,可以通過第三方轉發這個調用。之是以這麼做是因為有一個叫做“迪米特”的法則,如果兩個類不必彼此直接通信,那麼這兩個類就不應當發生直接的互相作用。中介者模式的定義:用一個中介對象來封裝一系列的對象互動。中介者使各個對象不需要顯示地互相引用,進而使其耦合松散,而且可以獨立地改變它們之間的互動。
中介者模式的UML類結構圖如下所示:

1 package day_10_mediator;
2
3 /**
4 * 中介者接口
5 * @author 餘林豐
6 *
7 * 2016年10月11日
8 */
9 public interface Mediator {
10 void send(String msg, AbstractObject object);
11 }
1 package day_10_mediator;
2
3 /**
4 * 具體中介者
5 * @author 餘林豐
6 *
7 * 2016年10月11日
8 */
9 public class ConcreteMediator implements Mediator {
10 private ConcreteObjectA concreteObjectA;
11 private ConcreteObjectB concreteObjectB;
12
13 public void setConcreteObjectA(ConcreteObjectA concreteObjectA) {
14 this.concreteObjectA = concreteObjectA;
15 }
16
17 public void setConcreteObjectB(ConcreteObjectB concreteObjectB) {
18 this.concreteObjectB = concreteObjectB;
19 }
20
21 /* (non-Javadoc)
22 * @see day_10_mediator.Mediator#send(java.lang.String, day_10_mediator.AbstractObject)
23 */
24 @Override
25 public void send(String msg, AbstractObject object) {
26 if (object == concreteObjectA){
27 concreteObjectB.notify(msg);
28 } else {
29 concreteObjectA.notify(msg);
30 }
31 }
32
33 }
1 package day_10_mediator;
2
3 /**
4 * 公共抽象類
5 * @author 餘林豐
6 *
7 * 2016年10月11日
8 */
9 public abstract class AbstractObject {
10 protected Mediator mediator;
11
12 public AbstractObject(Mediator mediator){
13 this.mediator = mediator;
14 }
15 }
1 package day_10_mediator;
2
3 /**
4 * 類A
5 * @author 餘林豐
6 *
7 * 2016年10月11日
8 */
9 public class ConcreteObjectA extends AbstractObject {
10
11 /**
12 * @param mediator
13 */
14 public ConcreteObjectA(Mediator mediator) {
15 super(mediator);
16 }
17
18 public void send(String msg){
19 mediator.send(msg, this);
20 }
21
22 public void notify(String msg){
23 System.out.println("ConcreteObjectA得到消息:" + msg);
24 }
25 }
1 package day_10_mediator;
2
3 /**
4 * @author 餘林豐
5 *
6 * 2016年10月11日
7 */
8 public class ConcreteObjectB extends AbstractObject {
9
10 /**
11 * @param mediator
12 */
13 public ConcreteObjectB(Mediator mediator) {
14 super(mediator);
15 }
16
17 public void send(String msg){
18 mediator.send(msg, this);
19 }
20
21 public void notify(String msg){
22 System.out.println("ConcreteObjectB得到消息:" + msg);
23 }
24 }
1 package day_10_mediator;
2
3 /**
4 * @author 餘林豐
5 *
6 * 2016年10月11日
7 */
8 public class Client {
9
10 public static void main(String[] args){
11 ConcreteMediator mediator = new ConcreteMediator();
12 ConcreteObjectA objectA = new ConcreteObjectA(mediator);
13 ConcreteObjectB objectB = new ConcreteObjectB(mediator);
14
15 mediator.setConcreteObjectA(objectA);
16 mediator.setConcreteObjectB(objectB);
17
18 objectA.send("Hello B");
19 objectB.send("Hello A");
20 }
21 }
手敲一遍,才能體會。
不積跬步,無以至千裡;不積小流,無以成江海。