java設計模式5——適配器模式

来源:https://www.cnblogs.com/xgp123/archive/2020/02/15/12306674.html
-Advertisement-
Play Games

1、結構型設計模式 2、適配器模式 3、類適配器 4、對象適配器 ...


java設計模式5——適配器模式

1、結構型模式介紹

1.1、作用

從程式的結構上實現松耦合,從而可以擴大整體的類結構,用來解決更大的問題。

分類:

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

    2、適配器模式介紹

    適配器模式(Adapter Pattern)是作為兩個不相容的介面之間的橋梁。這種類型的設計模式屬於結構型模式,它結合了兩個獨立介面的功能。

這種模式涉及到一個單一的類,該類負責加入獨立的或不相容的介面功能。舉個真實的例子,讀卡器是作為記憶體卡和筆記本之間的適配器。您將記憶體卡插入讀卡器,再將讀卡器插入筆記本,這樣就可以通過筆記本來讀取記憶體卡。

本節舉例:(網線和筆記本電腦)

3、第一種建模方式:(使用繼承,網線和轉換器綁在一起)又稱為類適配器

3.1、定義要適配的類(網線)

package com.xgp.company.結構性模式.第一種_適配器模式;

/**
 * 要被適配的類(網線)
 */
public class Adaptee {
    public void request() {
        System.out.println("連接網線上網!");
    }
}

3.2、定義客戶端類(電腦)

package com.xgp.company.結構性模式.第一種_適配器模式;

/**
 * 客戶端類:想上網,插不上網線
 */
public class Computer {

    //我們的電腦需要連接上轉接器才能上網
    public void net(NetToUsb adapter) {
        //上網的具體實現,找一個轉接頭
        adapter.handleRequest();
    }

    public static void main(String[] args) {
        //電腦,適配器,網線
        Computer computer = new Computer();
        Adapter adapter = new Adapter();
//        Adaptee adaptee = new Adaptee();

        computer.net(adapter);

    }
}

此時,該電腦無法插入網線進行上網,因此需要適配

3.3、定義適配器的抽象實現

package com.xgp.company.結構性模式.第一種_適配器模式;

/**
 * 介面轉換器的抽像實現
 */
public interface NetToUsb {
    //作用:處理請求(網 => usb)
    public void handleRequest();

}

3.4、定義具體的網線轉換器

package com.xgp.company.結構性模式.第一種_適配器模式;
/**
 * 1、繼承方式(類適配器)
 * 2、組合(對象適配器:常用)
 */

/**
 * 適配器:需要連接usb和網線
 */
public class Adapter extends Adaptee implements NetToUsb {

    @Override
    public void handleRequest() {
        //可以上網了
        super.request();
    }
}

此時網線通過適配器插入了電腦,實現了上網的功能了

連接網線上網!

4、第二種建模方式:(使用組合,網線和轉換器分離)又稱為對象適配器

網線類和適配器的抽象類不變

4.1、適配器類的改進

package com.xgp.company.結構性模式.第二種_適配器模式;
/**
 * 1、繼承方式(類適配器)
 * 2、組合(對象適配器:常用)
 */

/**
 * 適配器:需要連接usb和網線
 */
public class Adapter implements NetToUsb {

    private Adaptee adaptee;

    public Adapter(Adaptee adaptee) {
        this.adaptee = adaptee;
    }

    @Override
    public void handleRequest() {
        //可以上網了
        adaptee.request();
    }
}

4.2、電腦類的改進

package com.xgp.company.結構性模式.第二種_適配器模式;

/**
 * 客戶端類:想上網,插不上網線
 */
public class Computer {

    //我們的電腦需要連接上轉接器才能上網
    public void net(NetToUsb adapter) {
        //上網的具體實現,找一個轉接頭
        adapter.handleRequest();
    }

    public static void main(String[] args) {
        //電腦,適配器,網線
        Computer computer = new Computer();
        Adaptee adaptee = new Adaptee();

        Adapter adapter = new Adapter(adaptee);


        computer.net(adapter);

    }
}

4.3、測試,電腦成功連上網線進行上網了

連接網線上網!

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

-Advertisement-
Play Games
更多相關文章
  • 瀏覽器訪問網站過程 1. 用戶在瀏覽器地址欄中輸入網址 2. 瀏覽器解析網址構建HTTP請求 HTTP請求報文包括:請求行、請求頭和請求體 3. 瀏覽器發起DNS解析請求,將功能變數名稱轉化為IP地址 網址映射到伺服器IP地址,指定了訪問的伺服器 4. 瀏覽器發送請求報文給到伺服器 5. 伺服器接收並解析報 ...
  • 佈局是什麼?根據功能劃分小塊,再根據設計稿還原,書寫靜態頁面,然後再在塊裡面填充內容,完善功能,js施加交互效果。div作為一個容器,獨占一行,代碼書寫習慣從上至下屬於標準流,而浮動float的css樣式則打破div(標準流)獨占一行的傳統!具體代碼展示如下: ...
  • 盒模型規定了元素框處理元素內容width與height值、內邊距padding、邊框border 和 外邊距margin 的數值大小。邊框內的空白是內邊距padding,邊框外的空白是外邊距margin,如下所示,這個盒模型元素框的寬度值=內容區域的寬度+2(內邊距+外邊距+邊框),也就是該示例中的... ...
  • 能找到一份前端開發工作,首先你起碼得是一個合格的初級前端工程師。那麼,什麼是初級前端工程師?初級前端工程師都會做些什麼?這個問題需要分為以下幾個方面來說: ...
  • 前言 現在的前端門檻越來越高,不再是只會寫寫頁面那麼簡單。模塊化、自動化、跨端開發等逐漸成為要求,但是這些都需要建立在我們牢固的基礎之上。不管框架和模式怎麼變,把基礎原理打牢才能快速適應市場的變化。下麵介紹一些常用的源碼實現: call實現 bind實現 new實現 instanceof實現 Obj ...
  • 前言 昨天一番發了一篇批量下載手機壁紙的文章,分享了抓取到的美圖給小伙伴,然後一番就美美的去碎覺了。 早上起來看到有小伙伴在日更群里說有沒有狗哥的?憨憨的一番以為就是狗的圖片,於是就發了幾張昨天抓取的狗的圖片。 在群友的幫助下,一番才知道是愛情公寓里的一個演員。 小伙伴有需求,一番本著力所能及的幫助 ...
  • 時間輪演算法 時間輪是一種高效、低延遲的調度數據結構。其在Linux內核中廣泛使用,是Linux內核定時器的實現方法和基礎之一。按使用場景,大致可以分為兩種時間輪:原始時間輪和分層時間輪。分層時間輪是原始時間輪的升級版本,來應對時間“槽”數量比較大的情況,對記憶體和精度都有很高要求的情況。延遲任務的場景 ...
  • 前言 預設的 Identity 實體類型在大多數時候已經基本夠用,很多時候也只是稍微在 IdentityUser 類中增加一些自定義數據欄位,比如頭像。這次,我要向園友隆重介紹我魔改之後的 Identity 實體類,能支持一些特別風騷的操作。當然也完全相容內置的 UserManager、RoleMa ...
一周排行
    -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模塊筆記及使用 ...