5、設計模式之適配器模式/原型模式

文章目錄

  • 開始之前
  • 適配器模式
    • 使用場景
    • 注意事項
    • 何時使用
    • 優缺點
    • 代碼實現
  • 原型模式
    • 深拷貝和淺拷貝

開始之前

本章節是一個系列,里面用的的代碼實例都是連貫的。在實現某一種設計模式時,為了減少代碼篇幅,前面博客出現model類(僅限公用的model類,比如compute、CPU、Mem、Disk等純對象類)不會重復出現,讀者在閱讀某一篇博客時,如果發現突然出現了一個新的model類,在本片博客中沒有其定義,可以往前面的博客翻一下!

最后,當本系列更新完成后,我會整個的代碼完整貼出來,提供下載鏈接!

適配器模式

使用場景

有動機地修改一個正常運行的系統的接口,這時應該考慮使用適配器模式。

注意事項

適配器不是在詳細設計時添加的,而是解決正在服役的項目的問題。

何時使用

1、系統需要使用現有的類,而此類的接口不符合系統的需要。
2、想要建立一個可以重復使用的類,用于與一些彼此之間沒有太大關聯的一些類,包括一些可能在將來引進的類一起工作,這些源類不一定有一致的接口。
3、通過接口轉換,將一個類插入另一個類系中。(比如老虎和飛禽,現在多了一個飛虎,在不增加實體的需求下,增加一個適配器,在里面包容一個虎對象,實現飛的接口。)

優缺點

優點:

  • 1、可以讓任何兩個沒有關聯的類一起運行。
  • 2、提高了類的復用。
  • 3、增加了類的透明度。
  • 4、靈活性好。

缺點:

  • 1、過多地使用適配器,會讓系統非常零亂,不易整體進行把握。
    比如,明明看到調用的是 A 接口,其實內部被適配成了 B 接口的實現,
    一個系統如果太多出現這種情況,無異于一場災難。
    因此如果不是很有必要,可以不使用適配器,而是直接對系統進行重構。
  • 2.由于 JAVA 至多繼承一個類,所以至多只能適配一個適配者類,而且目標類必須是抽象類。

代碼實現

現在在之前代碼的基礎上,之前compute只能讀寫磁盤Disk,現在想要能夠適配讀寫SD卡。

public abstract class SDCard {protected abstract String getName();public void readSD(){System.out.println(getName()+" readSD");}public void writeSD(){System.out.println(getName()+" writeSD");}
}public class XiaomiSDCard extends SDCard{@Overrideprotected String getName() {return "xiao mi sdcard";}
}

適配器需要繼承已有的disk類,然后適配新的SD卡類

public class SDCardAdapter extends Disk {private final SDCard sdCard;public SDCardAdapter(SDCard sdCard) {this.sdCard = sdCard;}@Overrideprotected String getName() {return "sd card adapter";}@Overridepublic void read() {sdCard.readSD();}@Overridepublic void write() {sdCard.writeSD();}
}
public class Client {public static void main(String[] args) {System.out.println("正常模式");Compute compute = new ComputeBuilder().power(new V220()).mem(new XiaomiMem()).cpu(new XiaomiCpu()).disk(new XiaomiDisk())//需要適配的地方.build();compute.run();System.out.println("適配器模式");compute = new ComputeBuilder().power(new V220()).mem(new XiaomiMem()).cpu(new XiaomiCpu()).disk(new SDCardAdapter(new XiaomiSDCard()))//適配器模式.build();compute.run();}
}

原型模式

定義:通過復制現有實例來創建新的實例,無需知道相應類的信息。
簡單地理解,其實就是當需要創建一個指定的對象時,我們剛好有一個這樣的對象,但是又不能直接使用,我會clone一個一毛一樣的新對象來使用;基本上這就是原型模式。關鍵字:Clone。

深拷貝和淺拷貝

淺復制:將一個對象復制后,基本數據類型的變量都會重新創建,而引用類型,指向的還是原對象所指向的。
深復制:將一個對象復制后,不論是基本數據類型還有引用類型,都是重新創建的。簡單來說,就是深復制進行了完全徹底的復制,而淺復制不徹底。clone明顯是深復制,clone出來的對象是是不能去影響原型對象的

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

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

相關文章

【LabVIEW FPGA入門】同步C系列模塊

1.同步使用循環定時器VI計時循環速率的系列模塊 數字模塊SAR ADC 模塊多路復用模塊 數字通道可以在一個時鐘周期內執行。模擬通道需要多個時鐘周期。 同步模擬模塊的每個通道有一個 ADC,采集的數據在通道之間沒有明顯的偏差。多路復用模塊使用多路復用器通過單個 A…

Docker安裝并部署Gitlab,同時解決Gitlab服務經常503/500的問題

文章目錄 Docker 安裝Gitlab部署后需要解決的小問題1. 獲取初始密碼2. 解決剛安裝好的Gitlab頻繁出現503/500并重啟的錯誤 Docker 安裝Gitlab docker pull gitlab/gitlab-cedocker run -d -p 11443:443 -p 11090:80 -p 11022:22 \ --name gitlab \ --restart unless-stopped \…

深入理解NumPy與Pandas【numpy模塊及Pandas模型使用】

二、numpy模塊及Pandas模型使用 numpy模塊 1.ndarray的創建 import numpy as np anp.array([1,2,3,4]) bnp.array([[1,2,3,4],[5,6,7,8]]) print(a) #[1 2 3 4] print(b) #[[1 2 3 4][5 6 7 8]] 1.1使用array()函數創建 numpy.array(object, dtype None, copy True, ord…

vue2和vue3區別

Vue 3是Vue.js框架的下一代主要版本,它在2020年9月正式發布。Vue 3帶來了一系列的新特性和改進,包括性能提升、更小的打包尺寸、更好的TypeScript支持、新的組合式API等。以下是Vue 2和Vue 3之間的一些主要區別: 1. 性能提升: …

計算機存儲單位

目錄 是什么 存儲單位的劃分 存儲單位轉換關系表 相關疑問 存儲單位轉換除了位之外的存儲單位轉換規則是什么 為什么在編碼中最小的操作單位不是位 是什么 用來度量數據存儲容量的單位。 存儲單位的劃分 存儲單位有 位(bit,也稱為比特&#xff…

光伏項目怎么做預算?

隨著可再生能源行業的蓬勃發展,光伏行業也得到了擴張。許多想要加入光伏項目投資的人,都在為怎樣為項目做預算而苦惱,今天我就來跟大家分析下可以怎么做。 一、了解市場需求,確定預算目標 在制定光伏項目預算方案之前&#xff0c…

《SpringBoot》系列文章目錄

SpringBoot是由Pivotal團隊提供的全新框架,旨在簡化新Spring應用的初始搭建以及開發過程。以下是一些關于SpringBoot的詳細介紹: 設計目的:SpringBoot通過特定的方式來進行配置,使得開發人員不再需要定義樣板化的配置&#xff0c…

「貪心算法」將數組和減半的最少操作次數

力扣原題鏈接,點擊跳轉。 給你一個數組,每次可以把其中一個數減半,可以對同一個數多次減半。至少操作多少次,才能讓數組的和整體減少至少一半呢? 我們每次都選擇當前數組中最大的那個數減半,就能減少最多…

鏈路初始化和訓練

一、總覽 鏈路初始化和訓練,由物理層進行控制,是一個基于硬件的過程。初始化設備的鏈路和端口,使得設備能夠收發報文,在鏈路上正常通信。 在reset后由硬件自動啟動完整的訓練過程,并由LTSSM管理。 1 位鎖定 訓練開始…

【Vue】diff 算法

diff的時機 當組件創建時,以及依賴的屬性或數據變化時,會運行一個函數,該函數會做兩件事: 運行_render生成一棵新的虛擬dom樹(vnode tree),返回根節點運行_update,傳入虛擬dom樹的根節點,對新舊…

typedef定義結構體包含函數指針的巨坑

起因 嘗試在c中模仿c的類,把成員函數放置到結構體中。顯然只能放置一個結構體指針。 于是準備這么做。 錯誤示范 typedef struct {int id;void(*show)(Person p); }Person;void showPerson(Person p){ //.... }void init(Person * p){p->show showPerson; …

犀牛8 for Mac/Win:重塑三維建模的新標桿

在數字創意的浪潮中,犀牛8(Rhinoceros 8)作為一款卓越的三維建模軟件,以其強大的功能和出色的性能,在Mac和Windows平臺上都贏得了廣大設計師和工程師的青睞。 犀牛8不僅繼承了前代產品的優秀基因,更在細節…

基于python+Django+opencv的疲勞檢測系統設計與實現

博主介紹: 大家好,本人精通Java、Python、C#、C、C編程語言,同時也熟練掌握微信小程序、Php和Android等技術,能夠為大家提供全方位的技術支持和交流。 我有豐富的成品Java、Python、C#畢設項目經驗,能夠為學生提供各類…

Nginx的集群負載均衡(nginx構建tomcat集群案例)

一 .Nginx的集群負載均衡 1.nginx 集群負載均衡示意圖 2.四層負載均衡和7層負載均衡 LVS 四層負載均衡(常用); Haproxy四層負載均衡;Nginx 四層負載均衡; Haproxy七層負載均衡;Nginx 七層負載均衡(常用); 3.nginx構建tomcat集群 步驟1:安裝tomcat 步驟2:nginx配置tom…

夸夸生肖屬鼠的女性朋友

屬鼠人一生的命運受到許多因素的影響,包括性格、家庭、教育、環境等。屬鼠人性格外向、求知欲強、善解人意、善于結交各種各樣的朋友,有豐富的人脈,容易得到他人的幫助和支持。 屬鼠的人聰明、機智,他們善于觀察,富有…

MySQL(七) 表的內連和外連

表的連接分為內連和外連 9.1 內連接 內連接實際上就是利用where子句對兩種表形成的笛卡兒積進行篩選,我們前面學習的查詢都是內連接,也是在開發過程中使用的最多的連接查詢。 語法: select 字段 from 表1 inner join 表2 on 連接條件 and …

【代碼隨想錄】面試常考類型之動態規劃基礎題目

前言 更詳細的在大佬的代碼隨想錄 (programmercarl.com) 本系列僅是簡潔版筆記,為了之后方便觀看 做題步驟 含義公式初始化順序檢查 確定dp數組以及下標的含義遞推公式dp數組如何初始化遍歷順序打印dp數組(看哪里有問題) 斐波那契數 …

MFC:CFileFind類使用方法介紹

這是一個介紹MFC中CFileFind類的小程序。編寫這個程序使用的編輯軟件是VS2022&#xff0c;基于C空項目。在C空項目下要調用MFC類需要&#xff1a;首先&#xff0c;頭文件要包含<afx.h>&#xff0c;這個頭文件包含了絕大部分使用MFC所需頭文件&#xff1b;其次&#xff0c…

在線改圖片怎么做更簡單?快速修改圖片尺寸的方法

現在一般拍攝出的圖片尺寸都會比較大&#xff0c;想要上傳大網上的一些平臺展示時&#xff0c;經常會受到平臺的限制&#xff0c;無法將圖片正常上傳到平臺&#xff0c;那么如何將圖片尺寸快速調整呢&#xff1f;比較簡單的一種方式&#xff0c;可以通過在線改圖片的工具來實現…

一個開源的個人主頁模板,可以通過 Github Actions 來進行自動構建。

無名の主頁 簡單的小主頁&#xff0c;原來的看夠了&#xff0c;重新弄了一個 主頁的 Logo 字體已經過壓縮&#xff0c;若用本站 Logo 以外的字母會變回默認字體&#xff0c;這里是 完整字體&#xff0c;若無法下載&#xff0c;可將字體目錄下的 Pacifico-Regular-all.ttf 進行替…