設計模式(6) 適配器模式

来源:https://www.cnblogs.com/zhixin9001/archive/2020/07/13/13296031.html
-Advertisement-
Play Games

結構型模式 適配器模式 類適配器和對象適配器 結構型模式 結構型模式的重點在於如何通過靈活的體系組織不同的對象,併在此基礎上完成更為複雜的類型(或者類型系統),而參與組合的各類型之間始終保持儘量鬆散的結構關係。 結構型模式包括以下幾種: 適配器模式 橋接模式 組合模式 裝飾模式 外觀模式 享元模式 ...


  • 結構型模式
  • 適配器模式
  • 類適配器和對象適配器

結構型模式

結構型模式的重點在於如何通過靈活的體系組織不同的對象,併在此基礎上完成更為複雜的類型(或者類型系統),而參與組合的各類型之間始終保持儘量鬆散的結構關係。
結構型模式包括以下幾種:

  • 適配器模式
  • 橋接模式
  • 組合模式
  • 裝飾模式
  • 外觀模式
  • 享元模式
  • 代理模式

適配器模式

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類圖為:
適配器模式 UML類圖

所以適配器模式主要包括三個角色:

  • Target(ITarget):調用端所期待的介面;
  • Adaptee:需要被適配的類型;
  • Adapter:適配器,完成從Adaptee到Target的轉換。

適配器模式是一種相對簡單,而且使用廣泛的模式,在需要實現介面間的相容、隔離變化的時候,是一種很好的選擇。

參考書籍:
王翔著 《設計模式——基於C#的工程化實現及擴展》


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • <style> html{ display: none; <!--開始的時候讓頁面全部隱藏--> } </style> <script> function Web_Presentation() { document.querySelector('html').style.display='block ...
  • 在前面隨筆介紹了ABP+Vue前後端的整合處理,包括介紹了ABP的後端設計,以及前端對ABP介面API的ES6的封裝,通過JS的繼承類處理,極大減少了重覆臃腫的代碼,可以簡化對後端API介面的封裝,而且前端使用Element組件,很好展示API獲得的數據,通過在界面中展示樹狀列表,以及表格列表數據,... ...
  • 01 興趣 興趣是學習的第一老師。如果打算進入IT行業,找到自己興趣所在是最好的。 很多小伙伴對前後端分得不是很清楚,確認興趣方式如下: 通過網路視頻資源短期學習 線下培訓機構申請短期試學 一部分小伙伴試學後仍然感覺前後端差不多,很難判斷自己的興趣是前端還是後端。在這裡“興趣”的定義不是試學後滿心歡 ...
  • WEB學習路線2020完整版+附視頻教程,適合初學者的最新WEB前端學習路線彙總! ...
  • 以下純屬個人觀點和建議,肯定是有局限性的,但是也希望能給你帶來一些幫助。 我們儼然能感受到前端崗位現在已經發展成了最重要的研發崗位之一,所以多我們提出的要求也就越來越高了。所以我們需要的也就不僅僅只是掌握css、html、JavaScript了,但是這三大件一直都是前端的根本,這一點從未改變,而這三 ...
  • 1. 引言 1.1. 背景 隨著時代的進步,社會的發展,人們的生活形式與習慣也越來越多樣化,出行成為了人們生活中的一個重要組成部分,而客車成為許多人出行選擇的交通工具。面對巨大數量的乘客的購票需要,客車站就要選擇使用先進的管理方法來實現方便、快捷的售票、退票等方面的票務管理。隨著電腦的普及,信息處 ...
  • 動畫是將靜止的畫面變為動態的藝術.實現由靜止到動態,主要是靠人眼的視覺殘留效應。視覺殘留也叫視覺暫留現象,物體在快速運動時, 當人眼所看到的影像消失後,人眼仍能繼續保留其影像0.1~0.4秒左右的圖像,這種現象被稱為視覺暫留現象。利用人的這種視覺生理特性可製作出具有高度想象力和表現力的動畫影片。 電 ...
  • 一、 引言 對於一個多人團隊來說,制定一個統一的規範是必要的,因為個性化的東西無法產生良好的聚合效果,規範化可以提高編碼工作效率,使代碼保持統一的風格,以便於代碼整合和後期維護。 二、 HTML/CSS規範 2.1 瀏覽器相容 根據公司業務要求而定,一般:主流程測試:Chrome 30+、IE9+; ...
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...