【設計模式-3.2】結構型——適配器模式

說明:本文介紹設計模式中結構型設計模式中的,適配器模式;

插頭轉換器

適配器模式屬于結構型設計模式,設計思想體現在結構上的。以插頭轉換器為例,當你需要給手機充電,但是眼前只有一個三孔插座,二腳充電器無法使用三孔插座。

這時如果有一個插頭轉換器,可以將二孔插頭轉為三腳插頭,就可以解決眼前問題。這個轉換器扮演的就是適配器的角色。如下:

(TwoPin,二腳插座接口,只提供二腳插頭充電)

/*** 二腳插座*/
public interface TwoPin {/*** 二腳充電*/public void charge(int l, int r);
}

(ThreePin,三腳插座接口,只提供三腳插頭充電)

/*** 三腳插座*/
public interface ThreePin {/*** 三腳充電*/public void charge(int l, int r, int g);
}

(Phone,手機,充電器屬于二腳插頭)

/*** 手機*/
public class Phone implements TwoPin{@Overridepublic void charge(int l, int r) {System.out.println("手機充電中..." + l + "====" + r);}
}

(客戶端類,演示手機充電過程,二孔插頭無法插入三孔插座,類型錯誤)

在這里插入圖片描述

為了解決上面問題,我們可以創建一個適配器類,用來適配手機類使用三孔插座,如下:

/*** 適配器*/
public class Adapter implements ThreePin{/*** 適配器持有手機對象*/private Phone phone;/*** 適配手機使用三腳插座* @param l* @param r* @param g*/@Overridepublic void charge(int l, int r, int g) {phone.charge(l, r);}
}

(Client,客戶端,演示手機使用三腳插座)

/*** 客戶端*/
public class Client {public static void main(String[] args) {// 借助適配器,手機使用三腳插座充電Phone phone = new Phone();new Adapter(phone).charge(1, 1, 0);}
}

借助適配器,手機就可以使用三腳插座了;

在這里插入圖片描述

專屬適配器

當我們想讓該適配器專屬于手機,而不給其他類使用時,我們可以通過繼承的方式來實現。

如下:

(Phone,手機類,給手機一個name屬性,表示手機的名稱)

/*** 手機*/
public class Phone implements TwoPin{/*** 手機名稱*/protected String name;public Phone(String name) {this.name = name;}@Overridepublic void charge(int l, int r) {System.out.println(name + ":手機充電中..." + l + "====" + r);}
}

(PhoneAdapter,手機專屬適配器,繼承于手機,實現三腳插座接口)

/*** 手機專屬適配器*/
public class PhoneAdapter extends Phone implements ThreePin{/*** 適配器持有手機對象*/private Phone phone;public PhoneAdapter(Phone phone) {super(phone.name);this.phone = phone;}@Overridepublic void charge(int l, int r, int g) {System.out.println(name + ":在使用專屬的適配器給手機充電...");super.charge(l, r);}

(Client,客戶端,演示小米手機使用手機專屬的適配器,用三孔插座充電)

/*** 客戶端*/
public class Client {public static void main(String[] args) {// 小米手機使用手機專屬的適配器,用三孔插座充電Phone phone = new Phone("小米手機");new PhoneAdapter(phone).charge(1, 1, 0);}
}

在這里插入圖片描述

雙向適配器

雙向適配器,就是該適配器對二孔插頭、三孔插頭的充電器都可以適配,如下:

在這里插入圖片描述

代碼實現如下:

(MultipleAdapter,多重適配器,實現兩個接口,注入兩個對象,創建對應的兩個構造方法)

/*** 多重適配器*/
public class MultipleAdapter implements ThreePin, TwoPin{/*** 三孔插座*/private ThreePin threePin;/*** 二孔插座*/private TwoPin twoPin;public MultipleAdapter(ThreePin threePin) {this.threePin = threePin;}public MultipleAdapter(TwoPin twoPin) {this.twoPin = twoPin;}/*** 三孔插座充電* @param l* @param r* @param g*/@Overridepublic void charge(int l, int r, int g) {this.twoPin.charge(l, r);}/*** 二孔插座充電* @param l* @param r*/@Overridepublic void charge(int l, int r) {this.threePin.charge(l, r, 0);}
}

(Computer,創建一個電腦類,使用三孔插座的)

/*** 電腦*/
public class Computer implements ThreePin{/*** 電腦名稱*/protected String name;public Computer(String name) {this.name = name;}@Overridepublic void charge(int l, int r, int g) {System.out.println(name + ":充電中..." + l + "====" + r + "====" + g);}
}

(Client,客戶端,演示手機、電腦使用多重適配器給手機充電)

/*** 客戶端*/
public class Client {public static void main(String[] args) {// 電腦使用多重適配器,用二孔插座充電Computer computer = new Computer("聯想電腦");new MultipleAdapter(computer).charge(1,1);// 手機使用多重適配器,用三孔插座充電Phone phone = new Phone("小米手機");new MultipleAdapter(phone).charge(1,1,0);}
}

(不論是二孔插頭還是三孔插頭,都行)

在這里插入圖片描述

以上就是適配器模式的內容,適配的思想還是非常常見的,在Java中,方法重載不正是適配器模式在方法上的一種體現嗎?而適配器模式,是在類的層面上,對多種類、對象之間的一種適配。

總結

本文參考《設計模式的藝術》、《秒懂設計模式》兩書

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/210584.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/210584.shtml
英文地址,請注明出處:http://en.pswp.cn/news/210584.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java基本類型的高級使用方法詳解

引言 Java中的基本數據類型(primitive types)是構建程序的基礎,包括整型、浮點型、字符型、布爾型等。除了直接使用這些基本類型外,Java還提供了一些高級的使用方法,使得我們能夠更靈活地處理基本類型數據。本文將深入…

二叉樹結點個數、葉子結點個數、樹的高度、第k層結點個數的計算(C語言)

目錄 前言 分治算法 模擬二叉樹代碼 結點個數計算 錯誤方法 不便利方法 基于分治思想的方法 葉子結點個數 樹的高度 第k層結點的個數 前言 在鏈式二叉樹的前序、中序、后續遍歷中我們模擬了一棵二叉樹,并實現了它的前、中、后序遍歷,現在我們來…

UE4 .ini文件使用

在需要給配置文件的類中加上config標簽,當然變量也要加 在項目的Config下,新建一個Default類的UCLASS中config等于的名字,這里結合上面截圖就是DefaultTest 在下面寫入 [/Script/項目名/類名] 然后寫變量以及對應的值即可

【Angular 開發】Angular 信號的應用狀態管理

自我介紹 做一個簡單介紹,年近48 ,有20多年IT工作經歷,目前在一家500強做企業架構.因為工作需要,另外也因為興趣涉獵比較廣,為了自己學習建立了三個博客,分別是【全球IT瞭望】,【架構…

智能機器人在新材料方面遇到的挑戰

智能機器人在新材料方面面臨的挑戰包括但不限于以下幾點: 新材料的研發:機器人需要使用新材料來提高其性能和功能。然而,新材料的研發需要大量的時間和資金,同時還需要具備高超的技術和專業知識. 材料的可靠性:機器人…

GO面試題系列

1.GO有哪些關鍵字 2.GO有哪些數據類型 3.Go方法與函數的區別 在Go語言中,方法和函數是兩個不同的概念,盡管它們在某些方面有相似之處。下面是它們的主要區別: 定義位置: 函數: 函數是獨立聲明的,它們不…

python數據分析總結(pandas)

目錄 前言 df導入數據 df基本增刪改查 數據清洗 ?編輯 索引操作 數據統計 行列操作 ?編輯 df->types 數據格式化 ?編輯 日期數據處理 前言 此篇文章為個人python數據分析學習總結,總結內容大都為表格和結構圖方式,僅供參考。 df導入數…

Vue3使用vue-baidu-map-3x百度地圖

安裝vue-baidu-map-3x: // vue3 $ npm install vue-baidu-map-3x --save// vue2 $ npm install vue2-baidu-map --save 全局注冊/局部注冊: import { createApp } from vue import App from ./App.vue import BaiduMap from vue-baidu-map-3xconst app …

綜述 2017-Genome Biology:Alignment-free sequence comparison

Zielezinski, Andrzej, et al. "Alignment-free sequence comparison: benefits, applications, and tools." Genome biology 18 (2017): 1-17. https://genomebiology.biomedcentral.com/articles/10.1186/s13059-017-1319-7 被引次數:476應用問題&…

curl 18 HTTP/2 stream

cd /Users/haijunyan/Desktop/CustomKit/KeepThreadAlive/KeepThreadAlive //Podfile所在文件夾 git config --global https.postBuffer 10485760000 git config --global http.postBuffer 10485760000 pod install https://blog.csdn.net/weixin_41872403/article/details/86…

linux命令積累

1.查找指定目錄下第二層目錄,一年前的文件 find $dir -maxdepth 1 -type d -mtime 365 2./data/att/dir1軟連接到/data1/att/dir1 硬連接和軟連接的區別 硬連接 ln file1 file2 1.硬連接不能對目錄進行鏈接。 2.硬連接修改一個文件(不論修改哪方文件&…

top K問題(借你五分鐘)

目錄 前言 top K問題 模擬數據 建堆 驗證(簡單了解即可) 最終代碼 調試部分 前言 在大小堆的實現(C語言)中我們討論了堆的實際意義,在看了就會的堆排序(C語言)中我們完成了堆排序&#…

銀河麒麟本地軟件源配置方法

軟件源介紹 軟件源可以理解為軟件倉庫,當需要安裝軟件時則會根據源配置去相應的軟件源下載軟件包,此方法的優點是可以自動解決軟件包的依賴關系。常見的軟件源有光盤源、硬盤源、FTP源、HTTP源,本文檔主要介紹本地軟件源的配置方法&#xff…

功能強大的屏幕錄制和剪輯工具Camtasia Studio 2024 中文版

Camtasia Studio 2024 是一款功能強大的屏幕錄像工具,集視頻錄制、剪輯、編輯和播放于一體的多功能屏幕錄制軟件,Camtasia Studio 2024操作簡單,它能夠輕松為您將屏幕上的所有聲音、影音、鼠標移動的軌跡和麥克風聲音全部錄制下來&#xff0c…

分布式架構原理與實踐讀書筆記

分布式架構原理與實踐讀書筆記 IT 軟件架構的更迭:從單體架構,到集群架構,到現在的分布式和微服務架構。 分布式架構具有分布性、自治性、并行性、全局性等特點。 為了應對請求的高并發和業務的復雜性,需要對應用服務進行合理拆…

springboot(ssm暢游游戲銷售平臺 游戲電商系統Java系統

springboot(ssm暢游游戲銷售平臺 游戲電商系統Java系統 開發語言:Java 框架:ssm/springboot vue JDK版本:JDK1.8(或11) 服務器:tomcat 數據庫:mysql 5.7(或8.0) 數…

使用Jmeter做性能測試的注意點

一、性能測試注意點 1. 用jmeter測試時使用BeanShell腳本獲取隨機參數值,會導致請求時間過長,TPS過低。應改為使用csv讀取參數值,記錄的TPS會更加準確。 注:進行性能測試時,應注意會影響請求時間的操作,盡量…

[JVM 基礎 - Java 類加載機制]

這篇文章將帶你深入理解Java 類加載機制。 JVM 基礎 - Java 類加載機制 類的生命周期 類的加載: 查找并加載類的二進制數據連接 驗證: 確保被加載的類的正確性準備: 為類的靜態變量分配內存,并將其初始化為默認值解析: 把類中的符號引用轉換為直接引用初始化使用卸…

1-4、JDK目錄結構

語雀原文鏈接 文章目錄 1、目錄結構2、JDK中rt.jar、tools.jar和dt.jar作用3、bin目錄部分說明(基本工具) 1、目錄結構 bin目錄:包含一些用于開發Java程序的工具,例如:編譯工具(javac.exe)、運行工具 (java.exe) 、打…

菜鳥學習日記(python)——循環語句

python中的循環語句包括for循環語句和while循環語句,但是python中是沒有do...while循環語句的。 while循環語句 while循環語句的一般格式為; while condition:loop body condition是循環判斷條件,loop body是循環體。 當循環條件成立時,…