装饰着模式示例_装饰器设计模式示例
裝飾著模式示例
本文是我們名為“ Java設計模式 ”的學院課程的一部分。
在本課程中,您將深入研究大量的設計模式,并了解如何在Java中實現和利用它們。 您將了解模式如此重要的原因,并了解何時以及如何應用模式中的每一個。 在這里查看 !
目錄
1.簡介 2.什么是裝飾器設計模式 3.實施裝飾器設計模式 4.何時使用裝飾設計模式 5. Java中的裝飾器設計模式 6.下載源代碼1.簡介
要了解裝飾器設計模式,讓我們幫助比薩公司制作一個額外的打頂計算器。 用戶可以要求向披薩添加額外的配料,而我們的工作是使用該系統添加配料并提高價格。
這就像在運行時為我們的披薩對象增加了額外的責任,Decorator Design Pattern適合這種要求。 但是在此之前,讓我們進一步了解這種美麗的圖案。
2.什么是裝飾器設計模式
裝飾器設計模式的目的是動態地將附加職責附加到對象上。 裝飾器為子類提供了靈活的替代方案,以擴展功能。
裝飾器模式用于動態擴展對象的功能,而無需更改原始類的源或使用繼承。 這是通過在實際對象周圍創建一個稱為Decorator的對象包裝來完成的。
Decorator對象被設計為具有與基礎對象相同的接口。 這允許客戶端對象與Decorator對象進行交互,方式與與基礎實際對象進行交互的方式完全相同。 Decorator對象包含對實際對象的引用。 Decorator對象接收來自客戶端的所有請求(調用)。 反過來,它將這些調用轉發到基礎對象。 Decorator對象在將請求轉發到基礎對象之前或之后添加了一些其他功能。 這樣可以確保可以在運行時從外部將附加功能添加到給定對象,而無需修改其結構。
裝飾器可防止子類的泛濫,從而減少復雜性和混亂。 添加功能的任意組合都很容易。 相同的功能甚至可以添加兩次。 對于給定的對象,可以同時具有不同的裝飾器對象。 客戶端可以通過將消息發送到適當的裝飾器來選擇所需的功能。
圖1-類圖
零件
- 為可以動態添加職責的對象定義接口。
混凝土構件
- 定義可以附加其他職責的對象。
裝飾器
- 維護對Component對象的引用,并定義一個符合Component接口的接口。
混凝土裝飾工
- 向組件添加責任。
3.實施裝飾器設計模式
為簡單起見,讓我們創建一個僅包含兩種方法的簡單Pizza接口。
package com.javacodegeeks.patterns.decoratorpattern;public interface Pizza {public String getDesc();public double getPrice(); }getDesc方法用于獲取披薩的說明,而getPrice用于獲取價格。
以下是兩個具體的Pizza類:
package com.javacodegeeks.patterns.decoratorpattern;public class SimplyVegPizza implements Pizza{@Overridepublic String getDesc() {return "SimplyVegPizza (230)";}@Overridepublic double getPrice() {return 230;}}package com.javacodegeeks.patterns.decoratorpattern;public class SimplyNonVegPizza implements Pizza{@Overridepublic String getDesc() {return "SimplyNonVegPizza (350)";}@Overridepublic double getPrice() {return 350;}}裝飾器包裝需要增加功能的對象,因此需要實現相同的接口。 下面是一個抽象的裝飾器類,它將由所有具體的裝飾器擴展。
package com.javacodegeeks.patterns.decoratorpattern;public abstract class PizzaDecorator implements Pizza {@Overridepublic String getDesc() {return "Toppings";}}以下是具體的裝飾器類。
package com.javacodegeeks.patterns.decoratorpattern;public class Broccoli extends PizzaDecorator{private final Pizza pizza;public Broccoli(Pizza pizza){this.pizza = pizza;}@Overridepublic String getDesc() {return pizza.getDesc()+", Broccoli (9.25)";}@Overridepublic double getPrice() {return pizza.getPrice()+9.25;}}package com.javacodegeeks.patterns.decoratorpattern;public class Cheese extends PizzaDecorator{private final Pizza pizza;public Cheese(Pizza pizza){this.pizza = pizza;}@Overridepublic String getDesc() {return pizza.getDesc()+", Cheese (20.72)";}@Overridepublic double getPrice() {return pizza.getPrice()+20.72;}}package com.javacodegeeks.patterns.decoratorpattern;public class Chicken extends PizzaDecorator{private final Pizza pizza;public Chicken(Pizza pizza){this.pizza = pizza;}@Overridepublic String getDesc() {return pizza.getDesc()+", Chicken (12.75)";}@Overridepublic double getPrice() {return pizza.getPrice()+12.75;}}package com.javacodegeeks.patterns.decoratorpattern;public class FetaCheese extends PizzaDecorator{private final Pizza pizza;public FetaCheese(Pizza pizza){this.pizza = pizza;}@Overridepublic String getDesc() {return pizza.getDesc()+", Feta Cheese (25.88)";}@Overridepublic double getPrice() {return pizza.getPrice()+25.88;}}package com.javacodegeeks.patterns.decoratorpattern;public class GreenOlives extends PizzaDecorator{private final Pizza pizza;public GreenOlives(Pizza pizza){this.pizza = pizza;}@Overridepublic String getDesc() {return pizza.getDesc()+", Green Olives (5.47)";}@Overridepublic double getPrice() {return pizza.getPrice()+5.47;}}package com.javacodegeeks.patterns.decoratorpattern;public class Ham extends PizzaDecorator{private final Pizza pizza;public Ham(Pizza pizza){this.pizza = pizza;}@Overridepublic String getDesc() {return pizza.getDesc()+", Ham (18.12)";}@Overridepublic double getPrice() {return pizza.getPrice()+18.12;}}package com.javacodegeeks.patterns.decoratorpattern;public class Meat extends PizzaDecorator{private final Pizza pizza;public Meat(Pizza pizza){this.pizza = pizza;}@Overridepublic String getDesc() {return pizza.getDesc()+", Meat (14.25)";}@Overridepublic double getPrice() {return pizza.getPrice()+14.25;}}package com.javacodegeeks.patterns.decoratorpattern;public class RedOnions extends PizzaDecorator{private final Pizza pizza;public RedOnions(Pizza pizza){this.pizza = pizza;}@Overridepublic String getDesc() {return pizza.getDesc()+", Red Onions (3.75)";}@Overridepublic double getPrice() {return pizza.getPrice()+3.75;}}package com.javacodegeeks.patterns.decoratorpattern;public class RomaTomatoes extends PizzaDecorator{private final Pizza pizza;public RomaTomatoes(Pizza pizza){this.pizza = pizza;}@Overridepublic String getDesc() {return pizza.getDesc()+", Roma Tomatoes (5.20)";}@Overridepublic double getPrice() {return pizza.getPrice()+5.20;}}package com.javacodegeeks.patterns.decoratorpattern;public class Spinach extends PizzaDecorator{private final Pizza pizza;public Spinach(Pizza pizza){this.pizza = pizza;}@Overridepublic String getDesc() {return pizza.getDesc()+", Spinach (7.92)";}@Overridepublic double getPrice() {return pizza.getPrice()+7.92;}}我們需要用這些澆頭裝飾披薩對象。 上面的類包含對需要裝飾的披薩對象的引用。 裝飾器對象在調用裝飾器的函數后將其功能添加到裝飾器。
package com.javacodegeeks.patterns.decoratorpattern;import java.text.DecimalFormat;public class TestDecoratorPattern {public static void main(String[] args) {DecimalFormat dformat = new DecimalFormat("#.##");Pizza pizza = new SimplyVegPizza();pizza = new RomaTomatoes(pizza);pizza = new GreenOlives(pizza);pizza = new Spinach(pizza);System.out.println("Desc: "+pizza.getDesc());System.out.println("Price: "+dformat.format(pizza.getPrice()));pizza = new SimplyNonVegPizza();pizza = new Meat(pizza);pizza = new Cheese(pizza);pizza = new Cheese(pizza);pizza = new Ham(pizza);System.out.println("Desc: "+pizza.getDesc());System.out.println("Price: "+dformat.format(pizza.getPrice()));}}上面的代碼將產生以下輸出:
Desc: SimplyVegPizza (230), Roma Tomatoes (5.20), Green Olives (5.47), Spinach (7.92) Price: 248.59 Desc: SimplyNonVegPizza (350), Meat (14.25), Cheese (20.72), Cheese (20.72), Ham (18.12) Price: 423.81在上面的類中,我們首先創建了SimplyVegPizza ,然后用RomaTomatoes , GreenOlives和Spinach裝飾它。 輸出中的desc顯示添加在SimplyVegPizza中的澆頭,且價格為所有價格的總和。
我們對SimplyNonVegPizza做了同樣的事情,并在SimplyNonVegPizza添加了不同的SimplyNonVegPizza 。 請注意,您可以為一個對象多次裝飾同一件事。 在上面的示例中,我們兩次添加了cheese ; 價格也增加了兩倍,可以在輸出中看到。
當您需要在運行時為對象添加額外功能并對其進行修改時,Decorator設計模式看起來不錯。 但這會導致很多小物體。 使用Decorator的設計通常會導致系統由許多看起來相似的小對象組成。 對象的區別僅在于它們的互連方式不同,不在于它們的類或變量的值。 盡管這些系統很容易被了解它們的人定制,但它們可能很難學習和調試。
4.何時使用裝飾設計模式
在以下情況下,請使用Decorator模式:
- 動態透明地向單個對象添加職責,即不影響其他對象。
- 對于可以撤銷的責任。
- 當通過子類擴展不可行時。 有時可能會有大量獨立的擴展,并且會產生大量的子類來支持每種組合。 或者,類定義可能是隱藏的,或者子類無法使用。
5. Java中的裝飾器設計模式
- java.io.BufferedInputStream(InputStream)
- java.io.DataInputStream(InputStream)
- java.io.BufferedOutputStream(OutputStream)
- java.util.zip.ZipOutputStream(OutputStream)
- java.util.Collections#checked[List|Map|Set|SortedSet|SortedMap]()
6.下載源代碼
這是關于裝飾設計模式的課程。
您可以在此處下載相關的源代碼: DecoratorPattern-Project
翻譯自: https://www.javacodegeeks.com/2015/09/decorator-design-pattern.html
裝飾著模式示例
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的装饰着模式示例_装饰器设计模式示例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 枚举重名_举重设计模式示例
- 下一篇: 电脑上用MP3播放软件(电脑上用mp3播