亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java設計模式中裝飾者模式怎么實現

發布時間:2021-11-17 14:46:38 來源:億速云 閱讀:162 作者:小新 欄目:大數據

這篇文章給大家分享的是有關java設計模式中裝飾者模式怎么實現的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

具體的代碼。

java設計模式中裝飾者模式怎么實現

java設計模式中裝飾者模式怎么實現

java設計模式中裝飾者模式怎么實現

java設計模式中裝飾者模式怎么實現

java設計模式中裝飾者模式怎么實現

java設計模式中裝飾者模式怎么實現

至此我們實現了上述基本的需求了。但我們知道在游戲的角色中,除了攜帶武器外,還可以穿戴很多種飾品,也就是裝備。穿戴不同的裝備可以增加不同的攻擊力。如果我們將上述的需求在修改的復雜一點,也就是游戲角色除了要攜帶武器外,還可以穿戴很多種裝備。我們知道游戲中的裝備很多種為了方便我們測試,我們暫時只創建護肩、胸甲、飾品等。并且游戲角色穿戴不同的裝備需要為用戶增加不同的攻擊力。如果需求變更成這樣時,那我們應該怎么修改上述的代碼呢?具體的代碼如下:

java設計模式中裝飾者模式怎么實現

java設計模式中裝飾者模式怎么實現

java設計模式中裝飾者模式怎么實現

java設計模式中裝飾者模式怎么實現

java設計模式中裝飾者模式怎么實現

java設計模式中裝飾者模式怎么實現

java設計模式中裝飾者模式怎么實現

java設計模式中裝飾者模式怎么實現

我們現在已經實現了新的需求了。但上面的代碼雖然實現了需求,但是違背了設計模式的基本原則,也就是將程序中涉及到可能變化的部分提取出來。除此之外還違背了另一種設計模式的基本原則,也就是開放關閉原則。開放關閉原則:類應該對擴展開放,而對修改關閉。說的簡單點就是,如果我們已經開發好了一個類,如果有其他的需求,這個類現在并不能滿足我們的需求時,那么可以通過任何擴展的方式來改變我們這個類的行為,也就是前面說的對類的擴展是開放的。而不能通過直接在原有類中修改,這也就是前面所說的關閉,也就是說對一個已經開發好的類對它的修改是關閉的,不允許任何的修改,只能通過擴展來實現。如果我們現在要添加一個新的裝備,寵物類型的話,那么顯然上述的代碼違背了上述這2個設計模式的基本原則了,因為我們不得不修改原先已經修改好的代碼,這樣很容易會導致曾經已經編寫好的代碼產生新的問題。那么我們怎么能解決上述的問題呢?有沒有一種設計模式類似觀察者模式那樣呢?在我們創建新的觀察者時,是不需要重新修改主題的代碼的。答案一定是有的,也就是本文將要介紹的設計模式,也就是裝飾者模式。下面我們看一下裝飾者模式的定義。

裝飾者模式:動態地將責任附加到對象上,若要擴展功能,裝飾者提供了比繼承更有彈性的替代方案。

上面就是裝飾者模式的定義,說的比較籠統。下面我們以游戲的需求為例,在來做簡單的說明。如果我們創建一個游戲角色的話,如果不設置裝備的話,那么當前游戲角色就是沒有穿戴任何裝備,也就是當前游戲角色的攻擊力只有武器。如果我們這時想要穿戴護肩這個裝備的話,那么就創建這個護肩對象來裝飾這個游戲角色,如果我們這時還想要穿戴胸甲的話,那么就繼續創建胸甲這個對象來,繼續裝飾已經被護肩對象裝飾的游戲角色。以此類推,并且,每個對象都負責計算自己對象的攻擊力即可。這樣程序在運行時,會先執行最外面的裝飾對象,計算攻擊力,然后在繼續計算被它裝飾對象的攻擊力,這樣就達到了我們想要的效果了,也就是動態的為對象添加相應的職責了。那我們怎么保證,不同的對象可以彼此被裝飾呢?所以,在使用裝飾者模式有幾點需要特殊的注意。下面是幾點特殊的地方。

  • 裝飾者和被裝飾者對象有相同的超類型

  • 可以用一個或多個裝飾者包裝一個對象

  • 對象可以在任何時候被裝飾,可以重復使用任意裝飾者

下面我們將代碼修改為裝飾者模式,下面為具體的代碼:

java設計模式中裝飾者模式怎么實現

java設計模式中裝飾者模式怎么實現

java設計模式中裝飾者模式怎么實現

java設計模式中裝飾者模式怎么實現

java設計模式中裝飾者模式怎么實現

java設計模式中裝飾者模式怎么實現

java設計模式中裝飾者模式怎么實現

java設計模式中裝飾者模式怎么實現

java設計模式中裝飾者模式怎么實現

java設計模式中裝飾者模式怎么實現

這樣我們就將代碼修改為裝飾者模式的代碼了,如果我們要新添加寵物裝備時,我們只要新創建一個寵物類,并讓該類繼承裝備類GameEquipment即可,并且我們并不需要修改曾經已經編寫好的代碼,我們只是用了類的擴展而已。下面為具體的代碼。

java設計模式中裝飾者模式怎么實現

java設計模式中裝飾者模式怎么實現

java設計模式中裝飾者模式怎么實現

這就是裝飾者模式的好處,非常方便的擴展。但它也有相應的缺點就是會造成設計時有很多個類,因為任何一種裝飾都需要定義一種類,如果我們需要更多的裝備時時,那我們就要創建更多裝備的裝飾類,如果還有其它業務處理的話,我們又會創建符合這種需求的裝飾類。這就會造成一個簡單的工具類,會依賴很多個類,造成使用這個工具類的困惑。就像Java IO一樣,大家都知道IO里的類其在是大多了,多到很多類壓根就沒有用過 ,就是因為java io 也是采用了這種裝飾者模式,所以它需要為每一種可能有的需求都創建相應的裝飾類,來達到裝飾的目的。這也是裝飾者模式的弊端。但同時也是裝飾者模式的好處,也就是方便擴展,如果我們要想擴展Java IO中某些類的功能,那我們只需要創建一個新的裝飾者就可以了,這樣在程序中,我們就可以用我們自己創建的裝飾類,來裝飾Java IO中的對象了。

在Java IO中FilterInputStream類是一個抽象裝飾者,我們我們要實現自己的裝飾對象,那我們需要繼承FilterInputStream類。具體代碼如下:

直接讀取txt.txt內容:

java設計模式中裝飾者模式怎么實現

java設計模式中裝飾者模式怎么實現

現在我們新創建了一個新的裝飾類UpperCaseInputStream,也就是用這個裝飾類裝飾的對象,獲取出的內容都會將自動轉成大寫字母。下面為測試用例。

java設計模式中裝飾者模式怎么實現

java設計模式中裝飾者模式怎么實現

java設計模式中裝飾者模式怎么實現

這樣我們就可以直接用這個UpperCaseInputStream裝飾類去裝飾任何FilterInputStream的類了。這也就是裝飾模式的好處。

感謝各位的閱讀!關于“java設計模式中裝飾者模式怎么實現”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

威远县| 团风县| 湟中县| 兰考县| 宿州市| 江阴市| 秦安县| 咸宁市| 泾川县| 大安市| 通海县| 墨江| 博爱县| 聂拉木县| 宜丰县| 黄梅县| 遂溪县| 旬邑县| 商南县| 丁青县| 边坝县| 马关县| 乡城县| 崇州市| 广东省| 永新县| 双江| 钟祥市| 邵武市| 探索| 沅陵县| 灌云县| 云龙县| 蒙城县| 桂平市| 平乡县| 通许县| 民丰县| 梅河口市| 怀集县| 荔波县|