接口模式
在系統的設計時刻常常遇到這樣一個問題:類Client的實例instanceClient希望使用另一個對象instanceX提供的服務service,但在設計時刻並不能確定對象instanceX究竟屬於哪個類。常見的解決辦法是:將對象instanceX提供的服務service抽象為一個接口ServiceProvider,然後讓對象instanceClient通過持有接口ServiceProvider的實例來使用服務service。這種通過接口間接獲得服務的解決方案就是接口模式。
接口模式還可以有一些變化的形式:不止用一個接口抽象一個對象提供的服務,還可以用一組接口抽象一群對象的交互。
效果
接口模式有如下效果:
- 類Client不直接依賴於任何實在(concrete)的服務提供者,而僅僅依賴於輕量的接口,這樣就降低了系統的耦合程度。
- 因為接口將服務獨立出來,服務的提供者就可以變化。
- 因為引入了接口來間接提供服務,所以設計方案變得更加複雜。
評論
接口模式直接體現了面向對象設計的原則之一:「針對接口編程,而不是針對實現編程」。
許多其他的模式都應用了接口模式,只不過更為特殊。下表列出了作為接口模式特例的其他模式,並且指明了這些模式將哪些服務抽象為接口。
模式 | 抽象為接口的服務 |
代理模式 | 對對象的訪問 |
抽象工廠模式 | 創建對象家族 |
生成器模式 | 創建多個對象的組合 |
工廠方法模式 | 對象的實例化 |
原型模式 | 對象的實例化 |
單例模式 | 類的唯一實例的創建 |
命令模式 | 對請求的處理 |
迭代器模式 | 對成員的遍歷 |
觀察者模式 | 因目標(Subject)發生變化而作出反映 |
狀態模式 | 狀態與狀態的變化 |
策略模式 | 算法、策略 |
訪問者模式 | 作用於一組對象上的操作 |