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

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

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、測試,電腦成功連上網線進行上網了

連接網線上網!

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

更多相關文章
  • 瀏覽器訪問網站過程 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 ...
一周排行
  • .NET 走向開源,MIT許可協議。 微軟為了推動.NET開源社區的發展,2014年聯合社區成立了.NET基金會。 一年前 .NET 基金會完成第一次全面改選,2014年 .NET基金會的創始成員中有六位創始人,均非微軟公司員工,隨著微軟的收購動作,Miguel 也成了微軟員工,Migel一直在努力 ...
  • 在這篇文章中,我將帶領大家詳細學習ASP.NET Core 中的Main方法。在這篇文章中,我將向大家詳細介紹下麵幾個問題:ASP.NET Core Main方法的重要性為什麼我們在ASP.NET Core中會有一個Main方法?當你運行一個ASP.NET Core應用程式的時候,背後發生了什麼?為... ...
  • IViewLocationExpander API ExpandViewLocations Razor視圖路徑,視圖引擎會搜索該路徑. PopulateValues 每次調用都會填充路由 項目目錄如下所示 創建區域擴展器,其實我並不需要多區域,我目前只需要達到一個區域中有多個文件夾進行存放我的視圖. ...
  • EF Core 數據變更自動審計設計 Intro 有的時候我們需要知道每個數據表的變更記錄以便做一些數據審計,數據恢復以及數據同步等之類的事情, EF 自帶了對象追蹤,使得我們可以很方便的做一些審計工作,每次變更發生了什麼變化都變得很清晰,於是就基於 EF 封裝了一層數據變更自動審計 使用效果 測試 ...
  • 在上一篇文章abp(net core)+easyui+efcore實現倉儲管理系統——入庫管理之六(四十二)中我們實現了新增入庫單的功能。結合之前的五篇文章,今天我們來測試一下入庫單新增功能。 ...
  • 這篇文章,我們一起學習ASP.NET Core InProcess Hosting.這篇文章主要討論下麵幾個觀點:CreateDefaultBuilder方法執行什麼任務?什麼是ASP.NET Core InProcess Hosting?怎麼使用InProcess hosting Model來托管... ...
  • 關於 Blazor Server Side 的開篇 , Blazor與 C/S , B/S 有什麼不一樣 , Blazor有什麼優缺點? ...
  • VS2019+MVC+EF6 CodeFirst 連接MySQL 1、準備環境(通過NuGet獲取) EntityFramework MySql.Data.Entity 安裝後確認 2、在MVC Model文件夾下添加一個學生類,後面用它通過[數據遷移]在MySQL中創建一個表 3、創建數據上下文 ...
  • 這篇文章,向大家介紹ASP.NET Core中的Kestrel Web伺服器。這篇文章主要討論下麵兩個重要的事情:什麼是Kestrel 伺服器?怎麼使用.NET Core CLI來運行ASP.NET Core應用程式?什麼是Kestrel伺服器? 我們已經知道ASP.NET Core是一個跨平臺的開... ...
  • 前言 回顧之前的兩篇Swagger做Api介面文檔,我們大體上學會瞭如何在net core3.1的項目基礎上,搭建一套自動生產API介面說明文檔的框架。 本來在Swagger的基礎上,前後端開發人員在開發生產期間,可以藉此進行更加便捷的溝通交流。可是總有些時候,遇到一些難纏的,又不講道理,偏偏覺得將 ...