結構型模式的重點在於如何經過靈活的體系組織不一樣的對象,並在此基礎上完成更爲複雜的類型(或者類型系統),而參與組合的各種型之間始終保持儘可能鬆散的結構關係。
結構型模式包括如下幾種:設計模式
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 Softwarethis
使用適配器模式主要有兩個方面的目的:prototype
適配器的實現通常有兩種方式:設計
定義ITarget和Adaptee代理
public interface ITarget { void Request(); } public class Adaptee { public void SpecifiedRequest() { } }
類適配器code
public class ObjectAdapter : Adaptee, ITarget { public void Request() { //其餘處理 //... base.SpecifiedRequest(); //... } }
對象適配器對象
public class ClassAdapter : ITarget { private Adaptee adaptee; public void Request() { //其餘處理 //... adaptee.SpecifiedRequest(); //... } }
二者的區別有:blog
類適配器 | 對象適配器 |
---|---|
基於繼承概念 | 基於對象組合的思路 |
適配器以前不能繼承自其餘類、 Target只能是接口形式的ITarget | Target多是ITarget(接口), TargetRase(抽象類),甚至是實體類,只要Adapter知足不繼承兩個或兩個以上類的限制便可 |
能夠覆蓋 Adaptee的某些方法 | 沒法覆蓋 Adaptee的方法 |
雖然不能夠適配子類,但能夠經過覆蓋修改某些方法,部分狀況下能夠達到配子類一樣的效果 | 不只能夠適配 Adaptee,還能夠適配 Adaptee的任何子類 |
類適配器和對象適配器最大的區別在於對既有類型的使用上,在擴展新功能的時候,前者使用了繼承,後者使用組合的方式。對象適配器相對而言是被推薦的方式,由於使用組合帶來的耦合每每比繼承更鬆散。繼承
對象適配器的UML類圖爲:
接口
因此適配器模式主要包括三個角色:
適配器模式是一種相對簡單,並且使用普遍的模式,在須要實現接口間的兼容、隔離變化的時候,是一種很好的選擇。
參考書籍: 王翔著 《設計模式——基於C#的工程化實現及擴展》