設計模式(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
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...