国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

設計模式之裝飾器模式

開發(fā)
裝飾器模式可以將不同功能的單個模塊規(guī)劃至不同的裝飾器類中,各裝飾器類獨立自主,各司其職。

裝飾器模式(Decorator Pattern)是一種結構型設計模式,它可以在不改變現(xiàn)有對象的結構的情況下,動態(tài)地給對象增加一些額外的功能。裝飾器模式通過創(chuàng)建一個包裝對象(即裝飾器)來包裹真實對象,并在保持真實對象的接口不變的前提下,為其提供額外的功能。裝飾器模式可以在運行時根據(jù)需要選擇不同的裝飾器來組合和修改對象的行為。

  • Component(組件接口):所有被裝飾組件及裝飾器對應的接口標準,指定進行裝飾的行為方法。對應下文的的組件接口 Shape 。
  • ConcreteComponent(組件實現(xiàn)):需要被裝飾的組件,實現(xiàn)組件接口標準,只具備自身未被裝飾的原始特性。對應下文的的具體組件 Circle 、Rectangle 。
  • Decorator(裝飾器):裝飾器的高層抽象類,同樣實現(xiàn)組件接口標準,且包含一個被裝飾的組件。對應下文的抽象裝飾器 ShapeDecorator 。
  • ConcreteDecorator(裝飾器實現(xiàn)):繼承自裝飾器抽象類的具體子類裝飾器,可以有多種實現(xiàn),在被裝飾組件對象的基礎上為其添加新的特性。對應下文的具體裝飾器類 RedShapeDecorator 、GreenShapeDecorator 。

優(yōu)缺點

裝飾器模式的優(yōu)點有:

  • 裝飾器模式是繼承的有力補充,比繼承靈活,在不改變原有對象的情況下,動態(tài)地給一個對象擴展功能,即插即用。
  • 通過使用不同的裝飾器及這些裝飾器的排列組合,可以實現(xiàn)不同效果。
  • 裝飾器模式完全遵守開閉原則,可以在不修改原有代碼的基礎上增加新的功能。

裝飾器模式的缺點有:

  • 裝飾器模式會增加許多子類,過度使用會增加程序的復雜性。
  • 裝飾器模式會增加對象之間的聯(lián)系,可能會引入循環(huán)引用的問題。
  • 裝飾器模式會影響對象的標識,當使用裝飾器對對象進行包裝時,對象的類型和行為可能會發(fā)生變化。

應用場景

裝飾器模式適用于以下場景:

  • 當需要給一個現(xiàn)有的類添加附加職責,而又不能采用繼承的方式時,可以使用裝飾器模式。例如,在不修改原有代碼的情況下給一個窗口添加滾動條或者邊框等功能。
  • 當需要動態(tài)地給一個對象增加功能,而又需要撤銷該功能時,可以使用裝飾器模式。例如,在電子商務系統(tǒng)中根據(jù)用戶選擇的不同優(yōu)惠券來計算商品價格時,可以使用裝飾器模式來實現(xiàn)。
  • 當需要為一批兄弟類進行改裝或加裝功能時,可以使用裝飾器模式。例如,在一個圖形界面工具箱中為多個不同的組件提供一些公共的功能時,可以使用裝飾器模式來實現(xiàn)。

java 代碼示例

以下是一個實現(xiàn)裝飾器模式的 java 示例代碼

1.定義了一個抽象組件接口 Shape 和兩個具體組件類 Circle 和 Rectangle,

//抽象組件接口
public interface Shape {
    void draw();
}

//具體組件類:圓形
public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a circle");
    }
}

//具體組件類:矩形
public class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a rectangle");
    }
}

2.定義一個抽象裝飾器類 ShapeDecorator 和兩個具體裝飾器類 RedShapeDecorator 和 GreenShapeDecorator,

//抽象裝飾器類
public abstract class ShapeDecorator implements Shape {
    //持有一個抽象組件對象
    protected Shape shape;

    //構造方法
    public ShapeDecorator(Shape shape) {
        this.shape = shape;
    }

    //調(diào)用被包裝對象的方法
    @Override
    public void draw() {
        shape.draw();
    }
}

//具體裝飾器類:紅色裝飾器
public class RedShapeDecorator extends ShapeDecorator {
    //構造方法
    public RedShapeDecorator(Shape shape) {
        super(shape);
    }

    //重寫draw方法,在調(diào)用被包裝對象的方法之前或之后添加新的功能
    @Override
    public void draw() {
        //調(diào)用被包裝對象的方法
        super.draw();
        //添加新的功能
        setRedBorder();
    }

    //定義新的功能方法
    private void setRedBorder() {
        System.out.println("Setting red border");
    }
}

//具體裝飾器類:綠色裝飾器
public class GreenShapeDecorator extends ShapeDecorator {
    //構造方法
    public GreenShapeDecorator(Shape shape) {
        super(shape);
    }

    //重寫draw方法,在調(diào)用被包裝對象的方法之前或之后添加新的功能
    @Override
    public void draw() {
        //調(diào)用被包裝對象的方法
        super.draw();
        //添加新的功能
        setGreenBorder();
    }

    //定義新的功能方法
    private void setGreenBorder() {
        System.out.println("Setting green border");
    }
}

3.編寫裝飾器模式測試代碼,main 函數(shù)中創(chuàng)建了不同的組件和裝飾器對象,并調(diào)用了它們的方法,

//測試類
public class DecoratorPatternDemo {
    public static void main(String[] args) {
        //創(chuàng)建一個圓形對象
        Shape circle = new Circle();
        //創(chuàng)建一個矩形對象
        Shape rectangle = new Rectangle();
        //創(chuàng)建一個紅色裝飾器對象,包裝圓形對象
        Shape redCircle = new RedShapeDecorator(circle);
        //創(chuàng)建一個綠色裝飾器對象,包裝矩形對象
        Shape greenRectangle = new GreenShapeDecorator(rectangle);

        //調(diào)用各個對象的方法,展示不同的效果
        System.out.println("Normal circle:");
        circle.draw();
        System.out.println("Normal rectangle:");
        rectangle.draw();
        System.out.println("Red circle:");
        redCircle.draw();
        System.out.println("Green rectangle:");
        greenRectangle.draw();
    }
}

輸出結果如下:

Normal circle:
Drawing a circle
Normal rectangle:
Drawing a rectangle
Red circle:
Drawing a circle
Setting red border
Green rectangle:
Drawing a rectangle
Setting green border

Spring 代碼示例

要想再 Spring 項目中應用裝飾器模式,只需對以上代碼進行簡單改造即可,

1.給具體組件類 Circle、Rectangle 添加 @Component 注解,

@Component
public class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a rectangle");
    }
}

@Component
public class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a rectangle");
    }
}

2.給具體裝飾器類 RedShapeDecorator 和 GreenShapeDecorator 類添加 @Component 注解,

@Component
public class GreenShapeDecorator extends ShapeDecorator {
    // 構造方法
    public GreenShapeDecorator(@Qualifier("rectangle") Shape shape) {
        super(shape);
    }

    // 重寫draw方法,在調(diào)用被包裝對象的方法之前或之后添加新的功能
    @Override
    public void draw() {
        // 調(diào)用被包裝對象的方法
        super.draw();
        // 添加新的功能
        setGreenBorder();
    }

    // 定義新的功能方法
    private void setGreenBorder() {
        System.out.println("Setting green border");
    }
}

@Component
public class RedShapeDecorator extends ShapeDecorator {
    // 構造方法
    public RedShapeDecorator(@Qualifier("circle") Shape shape) {
        super(shape);
    }

    // 重寫draw方法,在調(diào)用被包裝對象的方法之前或之后添加新的功能
    @Override
    public void draw() {
        // 調(diào)用被包裝對象的方法
        super.draw();
        // 添加新的功能
        setRedBorder();
    }

    // 定義新的功能方法
    private void setRedBorder() {
        System.out.println("Setting red border");
    }
}

3.編寫 Spring 項目測試代碼,

@SpringBootTest
@RunWith(SpringRunner.class)
public class DecoratorTest {

    // 從Spring容器中獲取Context對象
    @Autowired
    private RedShapeDecorator redCircle;
    @Autowired
    private GreenShapeDecorator greenRectangle;

    @Test
    public void test() {
        System.out.println("Red circle:");
        redCircle.draw();
        System.out.println("Green rectangle:");
        greenRectangle.draw();
    }
}

輸出結果如下:

Red circle:
Drawing a circle
Setting red border
Green rectangle:
Drawing a rectangle
Setting green border

總結

裝飾器模式可以將不同功能的單個模塊規(guī)劃至不同的裝飾器類中,各裝飾器類獨立自主,各司其職。客戶端可以根據(jù)自己的需求自由搭配各種裝飾器,每加一層裝飾就會有新的特性體現(xiàn)出來,巧妙的設計讓功能模塊層層疊加,裝飾之上套裝飾,最終使原始對象的特性動態(tài)地得到增強。

責任編輯:趙寧寧 來源: waynblog
相關推薦

2023-12-13 13:28:16

裝飾器模式Python設計模式

2020-12-01 07:16:05

重學設計模式

2022-03-25 11:01:28

Golang裝飾模式Go 語言

2022-01-19 08:21:12

設計裝飾器模式

2024-02-23 12:11:53

裝飾器模式對象

2021-06-22 15:27:13

設計模式迭代器模式Java

2021-07-12 10:24:36

Go裝飾器代碼

2010-04-21 08:38:18

解釋器模式PHP設計模式

2010-04-29 08:53:11

PHP迭代器模式

2020-08-21 07:23:50

工廠模式設計

2024-04-10 12:27:43

Python設計模式開發(fā)

2012-02-29 09:41:14

JavaScript

2021-06-09 08:53:34

設計模式策略模式工廠模式

2012-01-13 15:59:07

2021-06-29 08:54:23

設計模式代理模式遠程代理

2021-12-24 07:50:45

責任鏈模式設計

2015-09-08 13:39:10

JavaScript設計模式

2021-06-16 08:56:06

模版方法模式設計模式行為型設計模式

2023-05-15 08:51:46

解釋器模式定義

2023-08-29 08:44:38

裝飾器組合模式
點贊
收藏

51CTO技術棧公眾號

午夜视频在线观看一区| 午夜精品久久久久久久99水蜜桃| 久久999免费视频| 欧美高潮视频| 日韩一区精品视频| 91精品国产99| 超级碰碰久久| av播放在线| 欧美亚洲国产一区在线观看网站| 小小水蜜桃在线观看| 九九视频免费观看视频精品| 亚洲电影中文字幕| 轻轻色免费在线视频| 国产在线一区二区| 肥熟一91porny丨九色丨| 久9re热视频这里只有精品| 亚洲成人精品久久| 国产黄在线观看| 一区二区三区国产精品| 日本www在线播放| 久久av老司机精品网站导航| 国产福利不卡| 欧美大人香蕉在线| 欧洲亚洲免费在线| 亚洲精品18| 中文字幕久久久av一区| 国产精品探花在线| 日韩精品影音先锋| www视频在线免费观看| 日本道精品一区二区三区| 黄页免费在线观看| 亚洲一区二区三区四区在线免费观看 | 国产精品成人免费电影| 6080亚洲理论片在线观看| 最近2019中文字幕在线高清| 成人黄色动漫| 亚洲第一免费播放区| 丝袜综合欧美| 欧美精品一区二区久久婷婷| 激情av在线| 日韩av影视在线| 特黄毛片在线观看| 精品国产乱码久久久久久久| 麻豆免费在线观看| 日韩一级黄色大片| 深夜在线视频| 精品国产欧美一区二区三区成人| 久久国内精品| 久久久噜噜噜久久久| 欧美一区二区三区久久| 欧美孕妇孕交黑巨大网站| 亚洲欧美tv| 国产日韩av在线| 亚洲高清二区| 亚洲免费不卡| 91丨九色丨黑人外教| 97操碰视频| 婷婷六月综合网| 日本三级在线视频| 亚洲福利小视频| 日韩成人在线一区| 日韩**中文字幕毛片| 午夜激情久久| 日本一区二区在线视频| 国产精品亚洲人在线观看| 成人观看免费完整观看| 国产精品久久毛片| 国产黄在线看| 精品一区电影国产| 精品久久ai| 91色p视频在线| 男女激情视频一区| 亚洲五月天综合| 亚洲成人自拍偷拍| 日本孕妇大胆孕交无码| 久久夜色精品国产| 日韩在线高清| 99精品一级欧美片免费播放| 国产精品婷婷午夜在线观看| 蜜桃视频在线免费| 亚洲香蕉在线观看| 欧美亚洲精品在线| 视频一区二区三| 国产精品久久久久影院色老大| 高清美女视频一区| 久久久国产精品一区| 91欧美在线| 欧美成人精品免费| 一本色道亚洲精品aⅴ| 欧美在线va视频| 91精品综合视频| 国产成人在线视频网址| 超碰97在线免费| 亚洲欧洲中文天堂| 伊人青青综合网| 国产精品裸体瑜伽视频| 在线观看网站黄不卡| 亚洲精品aa| 官网99热精品| 国产精品嫩草99a| h片视频在线观看| 国产精品网站大全| 成年人午夜久久久| 黄色av免费在线| 日本亚洲欧美三级| 国产精品亚洲午夜一区二区三区| 翔田千里一区| 欧美老女人在线视频| 先锋a资源在线看亚洲| 国产免费福利| 最近2019中文字幕第三页视频| 欧美不卡视频| 激情视频国产| 永久555www成人免费| 精品成人免费| aaa一级毛片| 丝袜美腿亚洲一区二区| 欧美亚洲三级| 在线播放你懂的| 欧美国产极速在线| 精品一区二区三区免费视频| 国产在线观看网站| 欧美在线视频网| zzijzzij亚洲日本少妇熟睡| 欧美午夜电影一区二区三区| 国产aⅴ夜夜欢一区二区三区| 不卡视频免费播放| 国产第一页在线视频| 99re在线| 中文字幕一区二区三区在线不卡 | 欧美日韩亚洲综合| 国产香蕉视频在线观看| 免费a在线观看| 久久国产亚洲精品无码| 国产一区亚洲| 97碰碰碰免费公开在线视频| 亚洲国产精品推荐| 狠狠色狠狠色综合日日tαg| 九色中文视频| 欧美高清电影在线看| 韩国精品在线观看| 99在线视频观看| 国产精品初高中精品久久| 一区二区三区免费在线观看| 综合欧美精品| av一区二区三区免费观看| 精品成a人在线观看| 亚洲一区区二区| 国产理论电影在线观看| 国产精品video| 伊人婷婷欧美激情| 精品国产一区二区三区香蕉沈先生| 成年人小视频网站| 久久综合久久八八| 久久午夜电影网| 亚洲精品一区二区三区中文字幕 | 亚洲精品成a人| 久久1电影院| 独立日3在线观看完整版| 97视频在线观看视频免费视频 | 久久99久久99精品免观看粉嫩| 蜜桃视频一区二区三区| 日本在线人成| 成人在线播放av| 婷婷中文字幕一区三区| 欧美人与牛zoz0性行为| 亚洲精选av在线| 国产精品高潮呻吟久久av野狼| 悠悠色在线精品| 精品免费在线| 桥本有菜亚洲精品av在线| 91在线精品视频| 欧美在线观看18| 日韩制服丝袜先锋影音| 天堂电影一区| 日韩激情免费视频| 欧美野外猛男的大粗鳮| 狠狠色狠色综合曰曰| 亚洲午夜视频| 俄罗斯一级**毛片在线播放 | heyzo久久| 久草福利在线视频| 日韩jizzz| 俺去了亚洲欧美日韩| 国产精品三级在线观看| 97精品国产| 午夜伦理大片视频在线观看| 喜爱夜蒲2在线| 欧美激情久久久久| 午夜精品福利一区二区三区av | 欧美一级二级三级九九九| 亚洲跨种族黑人xxx| 中文一区二区完整视频在线观看| 国产欧美日韩免费观看| 1769在线观看| 992tv成人免费观看| 久久久久久久国产精品| 欧美性猛交xxxxx水多| 亚洲乱码一区二区| 麻豆精品在线观看|