用裝飾器設計模式裝飾

裝飾圖案是廣泛使用的結構圖案之一。 此模式在運行時動態更改對象的功能,而不會影響對象的現有功能。 簡而言之,此模式通過包裝將附加功能添加到對象。

問題陳述:

想像一下我們有一個比薩餅,該比薩餅已經用番茄和奶酪烤制的情況。 之后,您只需要記住,您需要根據客戶的選擇添加一些其他澆頭。 因此,您需要在旅途中再添加一些配料,例如雞肉和胡椒粉。

意圖:

動態地從對象中添加或刪除其他功能或職責,而不會影響原始對象。
有時需要在無法通過子類添加功能的情況下進行,因為這可能會創建子類的負??載。

解:

因此,在這種情況下,我們不是在使用繼承為對象(例如披薩)添加其他功能,而是在使用合成。 當我們不想使用繼承而是使用組合時,此模式很有用。

結構體

Decorator Design Pattern

裝飾器設計模式結構

以下是“裝飾器設計”模式的參與者:

  • 組件 –這是包裝程序,在運行時可以承擔與其相關的其他職責。
  • 具體組件 –是添加了附加功能的原始對象。
  • 裝飾器 -這是一個抽象類,其中包含對組件對象的引用,并且還實現了組件接口。
  • 具體的裝飾器 -它們擴展了裝飾器并在Component類的頂部構建了附加功能。

例:

Decorator Design Pattern Example

裝飾器設計模式示例

在上面的示例中,Pizza類充當Component,BasicPizza是需要裝飾的具體組件。 PizzaDecorator充當Decorator抽象類,其中包含對Pizza類的引用。 ChickenTikkaPizza是ConcreteDecorator,它為Pizza類構建了附加功能。

讓我們總結一下實現裝飾器設計模式的步驟:

  • 創建一個我們要裝飾的BasicPizza(混凝土組件)的接口。
  • 創建一個抽象類PizzaDecorator,其中包含Pizza(decorated)接口的引用字段。
  • 注意:裝飾器(PizzaDecorator)必須擴展相同的裝飾(Pizza)接口。
  • 現在,我們需要在decorator的構造函數中傳遞要裝飾的Pizza對象。
  • 讓我們創建混凝土裝飾器(ChickenTikkaPizza),它應該提供附加澆筑的附加功能。
  • Concrete Decorator(ChickenTikkaPizza)應該擴展PizzaDecorator抽象類。
  • 將裝飾器(bakePizza())的方法重定向到裝飾類的核心實現。
  • 覆蓋需要更改行為的方法(bakePizza()),例如添加Chicken Tikka澆頭。
  • 讓客戶端類通過在Concrete Component(BasicPizza)的幫助下創建Concrete Decorator(ChickenTikkaPizza)來創建Component type(Pizza)對象。
  • 簡而言之:新組件=混凝土組件+混凝土裝飾器

比薩披薩=新的ChickenTikkaPizza(新的BasicPizza());

代碼示例:

BasicPizza.java

public String bakePizza() {return 'Basic Pizza';}

Pizza.java

public interface Pizza {public String bakePizza();
}

PizzaDecorator.java

public abstract class PizzaDecorator implements Pizza {Pizza pizza;public PizzaDecorator(Pizza newPizza) {this.pizza = newPizza;}@Overridepublic String bakePizza() {return pizza.bakePizza();}
}

ChickenTikkaPizza.java

public class ChickenTikkaPizza extends PizzaDecorator {public ChickenTikkaPizza(Pizza newPizza) {super(newPizza);}public String bakePizza() {return pizza.bakePizza() + ' with Chicken topping added';}
}

客戶端程序

public static void main(String[] args) {Pizza pizza = new ChickenTikkaPizza(new BasicPizza());System.out.println(pizza.bakePizza());}

優點:

裝飾器設計模式比標準繼承提供了更大的靈活性。 繼承還以靜態方式擴展了父類責任。 但是裝飾器允許以動態方式執行此操作。

退稅:

代碼調試可能很困難,因為此模式會在運行時添加功能。

有趣的一點:

  • 適配器模式將不同的接口插入在一起,而裝飾器模式則增強了對象的功能。
  • 與裝飾器模式不同,策略模式無需更改即可更改原始對象。
  • 代理模式控制對對象的訪問時,裝飾器模式增強了對象的功能。
  • Composite和Decorator模式都使用相同的樹結構,但兩者之間存在細微的差異。 當我們需要將具有相似行為的一組對象保留在另一個對象中時,可以使用復合模式。 但是,當我們需要在運行時修改對象的功能時,會使用裝飾器模式。
  • Java API中有許多裝飾器模式的實時示例。
    • java.io.BufferedReader;

如果我們看到了BufferedReader的構造函數,那么我們可以看到BufferedReader通過添加更多功能(例如,在reader類中不存在的readLine())包裝了Reader類。

我們可以使用與上述示例相同的格式來說明客戶端如何使用修飾符模式new BufferedReader(new FileReader(new File(“ File1.txt”)));

同樣, BufferedInputStream是裝飾對象FileInputStream的裝飾器。

BufferedInputStream bs = new BufferedInputStream(new FileInputStream(new File(“ File1.txt”))));

參考: 四人幫–在Idiotechie博客上使用JCG合作伙伴 Mainak Goswami的裝飾設計圖案進行裝飾 。

翻譯自: https://www.javacodegeeks.com/2012/12/decorate-with-decorator-design-pattern.html

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

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

相關文章

linux 內存強度測試軟件,linux下的CPU、內存、IO、網絡的壓力測試工具與方法介紹...

使用工具stressCentos# yum -y install stressUbantu# apt-get install stress# stress --helpstress imposes certain types of compute stress on your systemUsage: stress [OPTION [ARG]] ...-?, --help show this help statement--version show version statement-v, --v…

vcpkg安裝_微軟牌包管理器vcpkg更新及路線圖計劃

蝎子vcpkg是一套跨平臺,開源的C/C庫管理器,今天的這篇文章是有關vcpkg主題的2020年4月博文更新。在這篇文章中,我們將分享有關vcpkg 2020.04發布版本的一些信息以及vcpkg的路線圖(roadmap),我們會在這里持續地發布有關vcpkg的最新…

CSS 盒模型與box-sizing

一、盒模型 一個web頁面由許多html元素組成,而每一個html元素都可以表示為一個矩形的盒子,CSS盒模型正是描述這些矩形盒子的存在。 MDN的描述: When laying out a document, the browsers rendering engine represents each element as a r…

Java課程設計 購物車系統(個人博客) 201521123052 藍錦明

1. 團隊課程設計博客鏈接 課程設計團隊博客 2. 個人負責模塊或任務說明 (1)制作圖形菜單引導界面 (2)定義各獲取和輸出類函數 3. 自己的代碼提交記錄截圖 4. 自己負責模塊或任務詳細說明 import java.text.NumberFormat; public c…

7-12(圖) 社交網絡圖中結點的“重要性”計算(30 分)

在社交網絡中,個人或單位(結點)之間通過某些關系(邊)聯系起來。他們受到這些關系的影響,這種影響可以理解為網絡中相互連接的結點之間蔓延的一種相互作用,可以增強也可以減弱。而結點根據其所處…

linux系統的安裝程序,Linux系統安裝

為了不影響本機系統,建議在虛擬機上創建并安裝Linux系統,本次安裝centos7 64位的鏡像。詳細步驟如下:1、首先在虛擬機主頁創建新的虛擬機。... 圖1.1 2、選擇自定義安裝,這樣方便我們更好了解虛擬機,然后點擊下一步。.…

REST與Apache Camel

在Camel中公開HTTP終結點的方法有很多:jetty,tomcat,servlet,cxfrs和restlet。 其中的兩個組件– cxfrs和restlet也只需幾行代碼即可支持REST語義。 這個簡單的示例演示了如何使用camel-restlet和camel-jdbc進行CRUD操作。 四個HT…

百米路由器2登陸地址_騰達無線路由器怎么安裝,真的不錯

騰達無線路由器怎么安裝1、WAN口連接寬帶進線(即網絡公司進來的線或貓出來的線,一般顏色不一樣)、LAN口連接局域網內的電腦。2、設置所連接電腦的IP地址。右鍵點擊網上鄰居屬性3、右鍵點擊本地連接屬性4、選擇Internet協議TCP/IP屬性5、點擊選擇自動獲得IP地址和自動…

input點擊鏈接另一個頁面,各種操作。

1.鏈接到某頁<input type"button" name"Submit" value"確 定" class"btn" οnclick"location.hreffilename.html" />2.返回(等同后退)<input name"Submit2" type"button" class"btn"…

80. Remove Duplicates from Sorted Array II

題目描述 Follow up for “Remove Duplicates”: What if duplicates are allowed at most twice? For example, Given sorted array nums [1,1,1,2,2,3], Your function should return length 5, with the first five elements of nums being 1, 1, 2, 2 and 3. It doesn…

JavaFX 2 XYCharts和Java 7功能

我最喜歡的JavaFX 2功能之一是它在javafx.scene.chart包中提供的標準圖表。 該軟件包提供了幾種不同類型的現成圖表。 除了其中之一&#xff08; PieChart &#xff09;以外&#xff0c;所有其他都是“ 2軸圖”&#xff08; XYChart的特定實現&#xff09;。 在本文中&#xff…

前端基礎-HTML的的標簽詳解

閱讀目錄 一、head內常用標簽二、 HTML語義化三、 字符實體四、 h系列標簽五、 p標簽六、 img標簽七、 a標簽八、 列表標簽九、 table標簽十、 form標簽 一、 head內常用標簽 1、meta相關 #1、指定字符集<meta charset"gbk">#2、頁面描述<meta name"…

new失敗跟蹤函數_WinDbg預覽時間線:調試器中的時間線可以允許用戶記錄跟蹤

時間旅行調試(TTD)允許用戶記錄跟蹤&#xff0c;這些跟蹤是對程序執行的記錄。時間線是執行過程中發生的事件的直觀表示&#xff0c;這些事件可以是包括斷點&#xff0c;內存讀/寫&#xff0c;函數調用和返回以及異常。使用時間線窗口可以快速查看重要事件&#xff0c;了解相對…

linux 進程的執行時間,Linux 獲取進程執行時間

Linux 獲取進程執行時間1 前言測試一個程序的執行時間, 時間包括用戶 CPU 時間系統 CPU 時間時鐘時間之前獲取之前時間都是在程序的 main 函數用 time 函數實現, 這個只能粗略的計算程序的執行時間, 不能準確的獲取其他時間在看 APUE 時, 書中有關程序時間測試程序, 非常正規, …

Java環境變量的設置

1.計算機->屬性->高級系統設置->環境變量 2.設置JAVA_HOME和path&#xff0c;1.5之后的JDK可以不設置classpath 3.JAVA_HOME的路徑是JDK的安裝路徑 4.在系統變量里面找到path&#xff0c;然后點擊修改&#xff0c;在最后面添加%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin; 5…

merge

merge語句具有按條件獲取要更新或插入到表中的數據行&#xff0c;然后從1個或多個源頭對表進行更新或向表中插入行兩方面的能力。經常用在數據倉庫中移動大量數據。 語法: merge<hint> into<table_name> using<table_view_or_query> on<condition> whe…

可以優化同步嗎?

總覽 有一個常見的誤解&#xff0c;因為JIT很智能&#xff0c;并且可以消除對象的同步&#xff0c;而該對象僅存在于不影響性能的方法中。 比較StringBuffer和StringBuilder的測試 這兩個類基本上做相同的事情&#xff0c;除了一個是同步的&#xff08;StringBuffer&#xff0…

perl exe執行提示缺少文件解決方法

在項目開發中&#xff0c;使用perl語言編譯的exe可執行文件;在項目中使用了XML::LibXML模塊&#xff1b;發現exe在本機電腦執行正常&#xff0c;但在其他同事執行時卻提示缺少libxml2-2.dll等文件。 問題現象&#xff1a; 無法啟動此程序&#xff0c;因為計算機中丟失libxml2-2…

華為搶購助手_華為榮耀20系列手機采用的五項新科技,科普簡介

5月底榮耀20系列在上海發布&#xff0c;榮耀20系列旗艦手機擁有五項榮耀自主研發的新科技&#xff0c;包括LinkTurbo網絡聚合加速、超級NFC、方舟編譯器、人性化YOYO智慧生命體&#xff0c;超級藍牙。下面分別介紹一下這五項新科技。LinkTurbo網絡聚合加速先來科普一下LinkTurb…

Flex彈性布局

1 Flex: 彈性布局 (轉) 任何一個容器都可以指定為 Flex 布局。 1 .box {2  display: flex;3 } 行內元素也可以使用 Flex 布局。 1 .box{2 display: inline-flex;3 } 注意&#xff0c;設為 Flex 布局以后&#xff0c;子元素的 float、 clear 和 vertical-align 屬性將失效…