日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

装饰着模式示例_装饰器设计模式示例

發布時間:2023/12/3 asp.net 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 装饰着模式示例_装饰器设计模式示例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

裝飾著模式示例

本文是我們名為“ 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

裝飾著模式示例

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的装饰着模式示例_装饰器设计模式示例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。