裝飾器模式golang,裝飾器模式例子

本文目錄一覽:

IO流中的設計模式

1.IO中用到的適配器模式

在IO中,如將字符串數據轉變成字節數據保存到文件中,將字節數據轉變成流數據等都用到了適配器模式,下面以InputStreamReader和OutputStreamWriter類為例介紹適配器模式。

InputStreamReader和OutputStreamWriter類分別繼承了Reader和Writer接口,但要創建它們必須在構造函數中傳入一個InputStream和OutputStream的實例,InputStreamReader和OutputStreamWriter的作用也就是將InputStream和OutputStream適配到Reader和Writer。

InputStreamReader實現了Reader接口,並且持有了InputStream的引用,這是通過StreamDecoder類間接持有的,因為byte到char要經過編碼。

這裡,適配器就是InputStreamReader類,而源角色就是InputStream代表的實例對象,目標接口就是Reader類,OutputStreamWriter類也是類似的方式。

在IO中類似的還有,如StringReader將一個String類適配到Reader接口,ByteArrayInputStream適配器將byte數組適配到InputStream流處理接口。

2.IO中用到的裝飾模式

裝飾模式就是對一個類進行裝飾,增強其方法行為,在裝飾模式中,作為原來的這個類使用者還不應該感受到裝飾前與裝飾後有什麼不同,否則就破壞了原有類的結構了,所以裝飾器模式要做到對被裝飾類的使用者透明,這是對裝飾器模式的一個要求。總之裝飾器設計模式就是對於原有功能的擴展

在IO中有許多不同的功能組合情況,這些不同的功能組合都是使用裝飾器模式實現的,下面以FilterInputStream為例介紹裝飾器模式的使用。

InputStream類就是以抽象組件存在的,而FileInputStream就是具體組件,它實現了抽象組件的所有接口,FilterInputStream類就是裝飾角色,它實現了InputStream類的所有接口,並持有InputStream的對象實例的引用,BufferedInputStream是具體的裝飾器實現者,這個裝飾器類的作用就是使得InputStream讀取的數據保存在內存中,而提高讀取的性能。類似的還有LineNumberInputStream類,它的作用是提高按行讀取數據的功能。

總結

這兩種設計模式看起來都是起到包裝一個類或對象的作用,但是使用它 們的目的卻不盡相同。適配器模式主要在於將一個接口轉變成另一個接口,它的目的是通過改變接口來達到重複使用的目的;而裝飾器模式不是要改變被裝飾對象的接口,而是保持原有的接口,但是增強原有對象的功能,或改變原有對象的方法而提高性能。

補充:高性能的IO體系。

首先得明白什麼是同步,異步,阻塞,非阻塞.

1,同步和異步是針對應用程序和內核的交互而言的

2,阻塞和非阻塞是針對於進程在訪問數據的時候,根據IO操作的就緒狀態來採取的不同方式

總結一句簡短的話,同步和異步是目的,阻塞和非阻塞是實現方式。

名詞解釋

同步 指的是用戶進程觸發IO操作並等待或者輪詢的去查看IO操作是否就緒 自己上街買衣服,自己親自干這件事,別的事幹不了。

軟件開發中的裝飾器模式是什麼呢?

裝飾器模式就是動態地給一個對象添加一些額外的職責。就增加功能來說,裝飾器模式相比生成子類更為靈活。

1.裝飾器模式允許向一個現有的對象添加新的功能,同時又不改變其結構。這種類型的設計模式屬於結構性模式,它是作為現有的類的一個包裝。

2.這種模式創建了一個裝飾類,用來包裝原有的類,並在保持類方法簽名完整性的前提下,提供了額外的功能。

3.我們通過下面的實例來演示裝飾器模式的用法。其中,我們將把一個形狀裝飾上不同的顏色,同時又不改變形狀類。

什麼是裝飾器模式

裝飾器模式是允許向一個現有的對象添加新的功能,同時又不改變其結構。這種類型的設計模式屬於結構型模式,它是作為現有的類的一個包裝。通俗的來講,就是一個對象嵌入到另一個對象中去,實際上相當於這個對象被另一個對象包裝起來,形成一條包裝鏈。

主要是解決為了擴展一個類經常使用繼承方式實現,由於繼承為類引入靜態特徵,並且隨着擴展功能的增多,子類會很膨脹。優點是,裝飾類和被裝飾類可以獨立發展,不會相互耦合,裝飾模式是繼承的一個替代模式,裝飾模式可以動態擴展一個實現類的功能。

應用場景:(a)在不影響其他對象的情況下,以動態、透明的方式給單個對象添加職責。 (b) 需要動態地給一個對象增加功能,這些功能也可以動態地被撤銷。 當不能採用繼承的方式對系統進行擴充或者採用繼承不利於系統擴展和維護時。

在裝飾器模式中的角色有:

抽象構件(Component)角色:給出一個抽象接口,已規範準備接收附加責任的對象。具體構件(ConcreteComponent)角色:定義一個將要接收附加責任的類。裝飾(Decorator)角色:持有一個構件(Component)對象的實例,並定義一個與抽象構件接口一致的接口。具體裝飾(ConcreteDecorator)角色:負責給構件對象“貼上”附加的責任。

設計模式|菜鳥教程 – C3 結構型模式

適配器模式:SD讀卡器

橋接模式:抽象是抽象,具體是具體,隔離開來

過濾器模式:結果是一個list,用不同的標準類去過濾

組合模式:樹

裝飾器模式:實現同一套接口,但是增加功能

外觀模式:隱藏結構的複雜性,比如提供一個api接口,每個api調用的模塊細節隱藏

享元模式:

代理模式:實現同一套接口,但是功能不變,只是加一下控制

創建一個接口類,集成被擴展的類;

是作為兩個不兼容的接口之間的橋樑。這種類型的設計模式屬於結構型模式,它結合了兩個獨立接口的功能。

舉個真實的例子SD讀卡器,讀卡器是作為內存卡和筆記本之間的適配器。您將內存卡插入讀卡器,再將讀卡器插入筆記本,這樣就可以通過筆記本來讀取內存卡。

我們通過下面的實例來演示適配器模式的使用。其中,音頻播放器設備只能播放 mp3 文件,通過使用一個更高級的音頻播放器來播放 vlc 和 mp4 文件。

應用實例:

比如繪製四種車,每種車有3種啟動方式,將抽象和實現分離,解決多次繼承的問題。

不必要的繼承導致類爆炸;

在一個抽象類裡面聚合其他的抽象類(比多繼承好)

使用場景:

過濾器模式(Filter Pattern)或標準模式(Criteria Pattern)是一種設計模式,這種模式允許開發人員使用不同的標準來過濾一組對象,通過邏輯運算以解耦的方式把它們連接起來。

即聲明一種檢測標準類,如下:

通過實現這個接口來選出不同的對象。

其實就是樹的架構,每個節點都相同

應用實例:

動態地給一個對象添加一些額外的職責。就增加功能來說,裝飾器模式相比生成子類更為靈活。

類圖:

以下情況可以使用裝飾器模式:

隱藏系統的複雜性,並向客戶端提供了一個客戶端可以訪問系統的接口。這種類型的設計模式屬於結構型模式,它向現有的系統添加一個接口,來隱藏系統的複雜性。

享元模式嘗試重用現有的同類對象,如果未找到匹配的對象,則創建新對象。

跟單例模式差不多,可以稱之為多例模式:

核心使用一個hashmap存儲一個之前用過的對象,如果有了就不用創建新的了

何時使用:

應用實例:

一個類代表另一個類的功能。

主要解決:在直接訪問對象時帶來的問題,比如說:要訪問的對象在遠程的機器上。在面向對象系統中,有些對象由於某些原因(比如對象創建開銷很大,或者某些操作需要安全控制,或者需要進程外的訪問),直接訪問會給使用者或者系統結構帶來很多麻煩,我們可以在訪問此對象時加上一個對此對象的訪問層。

例子:

注意事項:

Kubectl源碼閱讀

本章的任務主線任務如下

其實kubectl的每個子命令流程大體分為三步,

首先以下面的命令作為起始任務,看看kubectl的代碼結構

kubernetes的所有組件入口函數幾乎都是一致的,使用的命令行解析庫是cobra

為什麼不直接用標準庫的flag呢?因為標準庫的flag庫與linux下的POSIX命令行參數標準不兼容,比如linux下的命令行 -a -b可以連起來寫成-ab, 而golang官方庫的flag不支持。

在深入get.NewCmdGet(“kubectl”, f, ioStreams)之前,首先看看委託者模式

輸出如下:

總的來書,具體的實現由Delegate實現,上層就是一層層的往下委託, 而kubectl中的f := cmdutil.NewFactory(matchVersionKubeConfigFlags)就是如此。

以ToRESTConfig方法為例,委託調用鏈如下

委託模式使得我們可以用聚合來替代繼承,它還使我們可以模擬mixin

每個cobra.Command的創建其實差不多

在深入請求的邏輯之前先看看代碼中用到的設計模式,其實還有一個裝飾器模式,但其實就是在原函數的基礎上包裝一層,就不說了。

訪問者模式的好處在於將熟悉的配置抽象成方法,可以隱藏一些複雜的細節,以及控制內部屬性

輸出如下

訪問者模式的好處在於定義統一的接口讓外部與內部交流,解耦數據與數據處理邏輯。

從上文知道,result對象最終在Do方法中創建,所以看下它對應的實現。

那麼從外層到內層的調用鏈如下:

構造對應的result對象

這個result對象的構造過程比較複雜,我也沒完全看懂,等我看懂了在來寫吧。

那麼繼續看看數據在哪裡出發吧。

未完待續。。。。

原創文章,作者:FBGHM,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/313722.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
FBGHM的頭像FBGHM
上一篇 2025-01-07 09:44
下一篇 2025-01-07 09:44

相關推薦

  • 使用Golang調用Python

    在現代軟件開發中,多種編程語言的協作是相當普遍的。其中一種使用場景是Golang調用Python,這使得在使用Python庫的同時,可以利用Golang的高性能和強大並發能力。這篇…

    編程 2025-04-29
  • 使用Golang創建黑色背景圖片的方法

    本文將從多個方面介紹使用Golang創建黑色背景圖片的方法。 一、安裝必要的代碼庫和工具 在開始創建黑色背景圖片之前,我們需要先安裝必要的代碼庫和工具: go get -u git…

    編程 2025-04-29
  • Python計數循環例子用法介紹

    在這篇文章中,我們將為您提供有關Python計數循環的一些詳細信息,並為您提供示例和代碼,讓您更深入地了解如何使用Python進行計數循環。 一、什麼是計數循環? 計數循環是編程中…

    編程 2025-04-28
  • 手機安全模式怎麼解除?

    安全模式是一種手機自身的保護模式,它會禁用第三方應用程序並使用僅限基本系統功能。但有時候,安全模式會使你無法使用手機上的一些重要功能。如果你想解除手機安全模式,可以嘗試以下方法: …

    編程 2025-04-28
  • Qt State Machine與狀態機模式

    本文將介紹Qt State Machine和狀態機模式在Qt中的實現。Qt提供了QStateMachine和QState兩個類,可以方便地實現狀態機模式,並且能有效地處理複雜的、多…

    編程 2025-04-27
  • 顯示C++設計模式

    本文將詳細介紹顯示C++設計模式的概念、類型、優點和代碼實現。 一、概念 C++設計模式是在軟件設計階段定義,用於處理常見問題的可重用解決方案。這些解決方案是經過測試和驗證的,並已…

    編程 2025-04-27
  • Centos7進入單用戶模式的解釋

    本文將介紹如何在Centos7中進入單用戶模式,並從以下幾個方面進行詳細的闡述。 一、Centos7進入單用戶模式的解答 在Centos7中進入單用戶模式需要執行以下步驟: 1. …

    編程 2025-04-27
  • 深入解析PSM模式

    一、PSM模式是什麼 PSM模式,即頁面-狀態-模型模式,是一種前端開發模式。它以頁面為中心,將頁面內的所有狀態和業務邏輯抽象成一個由頁面轉化而來的虛擬狀態機模型,從而將業務邏輯與…

    編程 2025-04-25
  • 授權碼模式與OAuth2.0

    一、什麼是授權碼模式 授權碼模式(Authorization Code Grant Type)是OAuth2.0協議中最常用的授權方式之一,也是最為安全的一種授權方式。授權碼模式的…

    編程 2025-04-24
  • 暗黑模式的盛行

    一、背景和定義 暗黑模式起源於智能手錶和夜視儀等專業設備上的配色方案,是指採用黑底白字、暗灰底白字等相對較暗的背景色搭配亮色前景,以減少屏幕對用戶眼睛的刺激,降低視覺疲勞感。這種設…

    編程 2025-04-24

發表回復

登錄後才能評論