大B:“你是否還記得應用廣泛的MVC分為哪三層?”
小A:“記得,模型層、表現層還有控製層。”
大B:“對,控製層便是位於表現層與模型層之間的中介者。籠統地說MVC也算是中介者模式在框架設計中的一個應用。由於中介者模式在定義上比較鬆散,在結構上和觀察者模式、命令模式十分相像;而應用目的又與結構模式‘門麵模式’有些相似。”
小A:“他們有哪些地方相似?”
大B:“在結構上,中介者模式與觀察者模式、命令模式都添加了中間對象——隻是中介者去掉了後兩者在行為上的方向。因此中介者的應用可以仿照後兩者的例子去寫。但是觀察者模式、命令模式中的觀察者、命令都是被客戶所知的,具體哪個觀察者、命令的應用都是由客戶來指定的;而大多中介者角色對於客戶程序卻是透明的。當然造成這種區別的原因是由於它們要達到的目的不同。從目的上看,中介者模式與觀察者模式、命令模式便沒有了任何關係,倒是與前麵講過的外觀模式有些相似。但是外觀模式是介於客戶程序與子係統之間的,而中介者模式是介於子係統與子係統之間的。這也注定了它們有很大的區別。”
小A:“他們都有什麼區別呢?”
大B:“外觀模式是將原有的複雜邏輯提取到一個統一的接口,簡化客戶對邏輯的使用。它是被客戶所感知的,而原有的複雜邏輯則被隱藏了起來。而中介者模式的加入並沒有改變客戶原有的使用習慣,它是隱藏在原有邏輯後麵的,使得代碼邏輯更加清晰可用。”
小A:“使用中介者模式最大的好處是什麼?”
大B:“使用中介者模式最大的好處就是將同事角色解耦。這帶來了一係列的係統結構改善:提高了原有係統的可讀性、簡化原有係統的通信協議——將原有的多對多變為一對多、提高了代碼的可複用性……但是中介者角色集中了太多的責任,所有有關的同事對象都要由它來控製。這不由得讓我想起了簡單工廠模式,但是由於中介者模式的特殊性——與業務邏輯密切相關,不能采用類似工廠方法模式的解決方法。因此建議在使用中介者模式的時候注意控製中介者角色的大校”
小A:“那什麼時候才是中介者模式的使用時機?”
大B:“一組對象以定義良好但是複雜的方式進行通信,產生了混亂的依賴關係,也導致對象難以複用。中介者模式很容易在係統中應用,也很容易在係統中誤用。當係統出現了‘多對多’交互複雜的對象群,不要急於使用中介者模式,而要先反思你的係統在設計上是不是合理。”
(本章完)