java 裝飾模式(Decorator Pattern)詳解
裝飾器模式(Decorator Pattern)允許向一個(gè)現(xiàn)有的對(duì)象添加新的功能,同時(shí)又不改變其結(jié)構(gòu)。這種類(lèi)型的設(shè)計(jì)模式屬于結(jié)構(gòu)型模式,它是作為現(xiàn)有的類(lèi)的一個(gè)包裝。
這種模式創(chuàng)建了一個(gè)裝飾類(lèi),用來(lái)包裝原有的類(lèi),并在保持類(lèi)方法簽名完整性的前提下,提供了額外的功能。
我們通過(guò)下面的實(shí)例來(lái)演示裝飾器模式的使用。其中,我們將把一個(gè)形狀裝飾上不同的顏色,同時(shí)又不改變形狀類(lèi)。
實(shí)現(xiàn)
我們將創(chuàng)建一個(gè) Shape 接口和實(shí)現(xiàn)了 Shape 接口的實(shí)體類(lèi)。然后我們創(chuàng)建一個(gè)實(shí)現(xiàn)了 Shape 接口的抽象裝飾類(lèi)ShapeDecorator,并把 Shape 對(duì)象作為它的實(shí)例變量。
RedShapeDecorator 是實(shí)現(xiàn)了 ShapeDecorator 的實(shí)體類(lèi)。
DecoratorPatternDemo,我們的演示類(lèi)使用 RedShapeDecorator 來(lái)裝飾 Shape 對(duì)象。
步驟 1
創(chuàng)建一個(gè)接口。
Shape.java
public interface Shape { void draw(); }
步驟 2
創(chuàng)建實(shí)現(xiàn)接口的實(shí)體類(lèi)。
Rectangle.java
public class Rectangle implements Shape { @Override public void draw() { System.out.println("Shape: Rectangle"); } } Circle.java public class Circle implements Shape { @Override public void draw() { System.out.println("Shape: Circle"); } }
步驟 3
創(chuàng)建實(shí)現(xiàn)了 Shape 接口的抽象裝飾類(lèi)。
ShapeDecorator.java
public abstract class ShapeDecorator implements Shape { protected Shape decoratedShape; public ShapeDecorator(Shape decoratedShape){ this.decoratedShape = decoratedShape; } public void draw(){ decoratedShape.draw(); } }
步驟 4
創(chuàng)建擴(kuò)展自 ShapeDecorator 類(lèi)的實(shí)體裝飾類(lèi)。
RedShapeDecorator.java
public class RedShapeDecorator extends ShapeDecorator { public RedShapeDecorator(Shape decoratedShape) { super(decoratedShape); } @Override public void draw() { decoratedShape.draw(); setRedBorder(decoratedShape); } private void setRedBorder(Shape decoratedShape){ System.out.println("Border Color: Red"); } }
步驟 5
使用 RedShapeDecorator 來(lái)裝飾 Shape 對(duì)象。
DecoratorPatternDemo.java
public class DecoratorPatternDemo { public static void main(String[] args) { Shape circle = new Circle(); Shape redCircle = new RedShapeDecorator(new Circle()); Shape redRectangle = new RedShapeDecorator(new Rectangle()); System.out.println("Circle with normal border"); circle.draw(); System.out.println("\nCircle of red border"); redCircle.draw(); System.out.println("\nRectangle of red border"); redRectangle.draw(); } }
步驟 6
驗(yàn)證輸出。
Circle with normal border Shape: Circle Circle of red border Shape: Circle Border Color: Red Rectangle of red border Shape: Rectangle Border Color: Red
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
- Java通俗易懂系列設(shè)計(jì)模式之裝飾模式
- java設(shè)計(jì)模式筆記之裝飾模式
- Java設(shè)計(jì)模式之裝飾模式原理與用法實(shí)例詳解
- java設(shè)計(jì)模式學(xué)習(xí)之裝飾模式
- Java設(shè)計(jì)模式之代理模式與裝飾模式實(shí)例詳解
- java 裝飾模式(Decorator Pattern)詳解及實(shí)例代碼
- 詳解java裝飾模式(Decorator Pattern)
- Java設(shè)計(jì)模式之裝飾模式(Decorator模式)介紹
- java設(shè)計(jì)模式之裝飾模式詳細(xì)介紹
- Java設(shè)計(jì)模式之裝飾模式詳解
相關(guān)文章
springboot加載命令行參數(shù)ApplicationArguments的實(shí)現(xiàn)
本文主要介紹了springboot加載命令行參數(shù)ApplicationArguments的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04Java多線程常見(jiàn)案例分析線程池與單例模式及阻塞隊(duì)列
這篇文章主要介紹了多線程的常見(jiàn)案例,線程池(重點(diǎn))、單例模式、阻塞隊(duì)列,本文通過(guò)圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05Json 自定義使用函數(shù)的簡(jiǎn)單實(shí)例
下面小編就為大家?guī)?lái)一篇Json 自定義使用函數(shù)的簡(jiǎn)單實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-10-10java實(shí)現(xiàn)網(wǎng)上購(gòu)物車(chē)程序
這篇文章主要介紹了java實(shí)現(xiàn)網(wǎng)上購(gòu)物車(chē)程序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01Spring Boot整合Spring Security簡(jiǎn)單實(shí)現(xiàn)登入登出從零搭建教程
這篇文章主要給大家介紹了關(guān)于Spring Boot整合Spring Security簡(jiǎn)單實(shí)現(xiàn)登入登出從零搭建的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧2018-09-09SpringSecurity整合springBoot、redis實(shí)現(xiàn)登錄互踢功能
這篇文章主要介紹了SpringSecurity整合springBoot、redis實(shí)現(xiàn)登錄互踢,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-05-05如何動(dòng)態(tài)修改JavaBean中注解的參數(shù)值
這篇文章主要介紹了如何動(dòng)態(tài)修改JavaBean中注解的參數(shù)值操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02