結構型模式 適配器模式 類適配器和對象適配器 結構型模式 結構型模式的重點在於如何通過靈活的體系組織不同的對象,併在此基礎上完成更為複雜的類型(或者類型系統),而參與組合的各類型之間始終保持儘量鬆散的結構關係。 結構型模式包括以下幾種: 適配器模式 橋接模式 組合模式 裝飾模式 外觀模式 享元模式 ...
- 結構型模式
- 適配器模式
- 類適配器和對象適配器
結構型模式
結構型模式的重點在於如何通過靈活的體系組織不同的對象,併在此基礎上完成更為複雜的類型(或者類型系統),而參與組合的各類型之間始終保持儘量鬆散的結構關係。
結構型模式包括以下幾種:
- 適配器模式
- 橋接模式
- 組合模式
- 裝飾模式
- 外觀模式
- 享元模式
- 代理模式
適配器模式
GOF對適配器模式的描述為:
Specify the kinds of objects to create using a prototypical instance, and create new objects by copying this prototype..
— Design Patterns : Elements of Reusable Object-Oriented Software
使用適配器模式主要有兩個方面的目的:
- 舊介面在新的環境下不相容時,藉助適配器模式完成從舊介面到新介面的轉換。
- 將“既有系統”進行封裝,邏輯上客戶程式不知道“既有系統”的存在,將變化隔離在Adapter部分。如果客戶程式需要遷移,僅需要在Adapter部分做修改。
類適配器和對象適配器
適配器的實現一般有兩種方式:
- 類適配器,通過繼承讓適配器類具有既有類型的特點,同時也可以根據客戶程式的需要,滿足新介面的需要
- 對象適配器,在適配器里保存一個既有類型的引用,它自身按照客戶程式的要求,實現新介面。
定義ITarget和Adaptee
public interface ITarget
{
void Request();
}
public class Adaptee
{
public void SpecifiedRequest() { }
}
類適配器
public class ObjectAdapter : Adaptee, ITarget
{
public void Request()
{
//其他處理
//...
base.SpecifiedRequest();
//...
}
}
對象適配器
public class ClassAdapter : ITarget
{
private Adaptee adaptee;
public void Request()
{
//其他處理
//...
adaptee.SpecifiedRequest();
//...
}
}
兩者的區別有:
類適配器 | 對象適配器 |
---|---|
基於繼承概念 | 基於對象組合的思路 |
適配器之前不能繼承自其他類、 Target只能是介面形式的ITarget | Target可能是ITarget(介面), TargetRase(抽象類),甚至是實體類,只要Adapter滿足不繼承兩個或兩個以上類的限制即可 |
可以覆蓋 Adaptee的某些方法 | 無法覆蓋 Adaptee的方法 |
雖然不可以適配子類,但可以通過覆蓋修改某些方法,部分情況下可以達到配子類同樣的效果 | 不僅可以適配 Adaptee,還可以適配 Adaptee的任何子類 |
類適配器和對象適配器最大的區別在於對既有類型的使用上,在擴展新功能的時候,前者使用了繼承,後者使用組合的方式。對象適配器相對而言是被推薦的方式,因為使用組合帶來的耦合往往比繼承更鬆散。
對象適配器的UML類圖為:
所以適配器模式主要包括三個角色:
- Target(ITarget):調用端所期待的介面;
- Adaptee:需要被適配的類型;
- Adapter:適配器,完成從Adaptee到Target的轉換。
適配器模式是一種相對簡單,而且使用廣泛的模式,在需要實現介面間的相容、隔離變化的時候,是一種很好的選擇。
參考書籍:
王翔著 《設計模式——基於C#的工程化實現及擴展》