10-Java裝飾器模式 ( Decorator Pattern )

Java裝飾器模式

    • 摘要
    • 實現
    • 范例

  • 裝飾器模式(Decorator Pattern)允許向一個現有的對象添加新的功能,同時又不改變其結構

  • 裝飾器模式創建了一個裝飾類,用來包裝原有的類,并在保持類方法簽名完整性的前提下,提供了額外的功能

裝飾器模式屬于結構型模式,它是作為現有的類的一個包裝

摘要

1. 意圖

動態地給一個對象添加一些額外的職責。就增加功能來說,裝飾器模式相比生成子類更為靈活

2. 主要解決

一般的,我們為了擴展一個類經常使用繼承方式實現,由于繼承為類引入靜態特征,并且隨著擴展功能的增多,子類會很膨脹

3. 何時使用

  • 在不想增加很多子類的情況下擴展類

4. 如何解決

將具體功能職責劃分,同時繼承裝飾者模式

5. 關鍵代碼

  • Component類充當抽象角色,不應該具體實現;
  • 修飾類引用和繼承Component類,具體擴展類重寫父類方法;

6. 應用實例

  • 孫悟空有72變,當他變成”廟宇”后,他的根本還是一只猴子,但是他又有了廟宇的功能;
  • 不論一幅畫有沒有畫框都可以掛在墻上,但是通常都是有畫框的,并且實際上是畫框被掛在墻上在掛在墻上之前,畫可以被蒙上玻璃,裝到框子里;這時畫、玻璃和畫框形成了一個物體;

7. 優點

  • 裝飾類和被裝飾類可以獨立發展,不會相互耦合,裝飾模式是繼承的一個替代模式,裝飾模式可以動態擴展一個實現類的功能

8. 缺點

  • 多層裝飾比較復雜

9. 使用場景

  • 擴展一個類的功能;
  • 動態增加功能,動態撤銷;

10. 注意事項

  • 可代替繼承

實現

在這里插入圖片描述

  1. 創建一個Shape接口和實現了Shape接口的實體類;
  2. 創建一個實現了Shape接口的抽象裝飾類ShapeDecorator,并把Shape對象作為它的實例變量;
  3. 創建類RedShapeDecorator實現了ShapeDecorator實體類;
  4. 創建類DecoratorPatternDemo使用RedShapeDecorator來裝飾Shape對象;

范例

我們通過下面的范例來演示裝飾器模式的用法,其中,我們將把一個形狀裝飾上不同的顏色,同時又不改變形狀類

1.創建一個接口.

Shape.java

package com.demo.gof;
public interface Shape {void draw();
}

2. 創建實現接口的實體類

Rectangle.java

package com.demo.gof;
public class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("Shape: Rectangle");}
}

Circle.java

package com.demo.gof;
public class Circle implements Shape {@Overridepublic void draw() {System.out.println("Shape: Circle");}
}

3. 創建實現了 Shape 接口的抽象裝飾類

ShapeDecorator.java

package com.demo.gof;
public abstract class ShapeDecorator implements Shape {protected Shape decoratedShape;public ShapeDecorator(Shape decoratedShape){this.decoratedShape = decoratedShape;}public void draw(){decoratedShape.draw();}    
}

4. 創建擴展了 ShapeDecorator 類的實體裝飾類

RedShapeDecorator.java

package com.demo.gof;
public class RedShapeDecorator extends ShapeDecorator {public RedShapeDecorator(Shape decoratedShape) {super(decoratedShape);        }@Overridepublic void draw() {decoratedShape.draw();           setRedBorder(decoratedShape);}private void setRedBorder(Shape decoratedShape){System.out.println("Border Color: Red");}
}

5. 使用 RedShapeDecorator 來裝飾 Shape 對象

DecoratorPatternDemo.java

package com.demo.gof;
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();}
}

編譯運行以上 Java 范例,輸出結果如下

$ javac -d . src/main/com.demo/gof/DecoratorPatternDemo.java
$ java  com.demo.gof.DecoratorPatternDemo
Circle with normal border
Shape: CircleCircle of red border
Shape: Circle
Border Color: RedRectangle of red border
Shape: Rectangle
Border Color: Red

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

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

相關文章

代購程序api接口采集商品信息接入演示示例

以下是一個使用Java編寫的簡單示例,演示如何通過API接口采集商品信息并接入到代購程序中: import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; impor…

vue使用swiper(輪播圖)-真實項目使用

一、安裝 我直接安裝的vue-awesome-swiper": "^3.1.3"指定版本 npm install vue-awesome-swiper3.1.3 swiper --save二、vue頁面使用&#xff0c;寫了一個小demo <template><div class"vue-swiper"><h1>{{ msg }}</h1><…

陶瓷工業5G智能制造工廠數字孿生可視化平臺,推進行業數字化轉型

陶瓷工業5G智能制造工廠數字孿生可視化平臺&#xff0c;推進行業數字化轉型。在陶瓷工業領域&#xff0c;5G智能制造工廠數字孿生可視化平臺的應用正在改變著行業的傳統生產模式&#xff0c;推動著數字化轉型的進程。本文將圍繞這一主題展開探討&#xff0c;分析數字孿生可視化…

Unity GC + C# GC + Lua GC原理

Unity垃圾回收原理 參考文章&#xff1a;垃圾回收 (計算機科學) - 維基百科&#xff0c;自由的百科全書 (wikipedia.org) 在計算機科學中&#xff0c;垃圾回收&#xff08;英語&#xff1a;Garbage Collection&#xff0c;縮寫為GC&#xff09;是指一種自動的存儲器管理機制。…

配置之道:深入研究Netty中的Option選項

歡迎來到我的博客&#xff0c;代碼的世界里&#xff0c;每一行都是一個故事 配置之道&#xff1a;深入研究Netty中的Option選項 前言Option的基礎概念ChannelOption與Bootstrap Option常見的ChannelOption類型ChannelConfig的使用Option的生命周期不同傳輸協議的Option 前言 在…

Linux下檢查端口占用

很多網站都給出方法檢查出端口占用的進程&#xff0c;直接就kill掉&#xff0c;并不檢查占用進程的詳細情況&#xff0c;如&#xff1a;https://www.runoob.com/w3cnote/linux-check-port-usage.html 正常情況下&#xff0c;需要對進程進行檢查 ls /proc/進程ID -l

Tomcat部署Web服務器及基礎功能配置

前言 Tomcat作為一款網站服務器&#xff0c;目前市面上Java程序使用的比較多&#xff0c;作為運維工人&#xff0c;有必要了解一款如何去運行Java環境的網站服務。 目錄 一、Java相關介紹 1. Java歷史 2. Java跨平臺服務 3. Java實現動態網頁功能 3.1 servelt 3.2 jsp …

Revit-二開之創建TextNote-(1)

Revit二開之創建TextNote TextNode在Revit注釋模塊中&#xff0c;具體位置如圖所示 圖中是Revit2018版本 【Revit中的使用】 Revit 中的操作是點擊上圖中的按鈕在平面視圖中點擊任意放置放置就行&#xff0c; 在屬性中可以修改文字 代碼實現 創建TextNode ExternalComm…

Web Tomcat

目錄 1 前言2 Tomcat的安裝3 Tomcat文件的構成4 Tomcat的使用步驟 1 前言 Tomcat是一個 http(web)的容器&#xff0c;籠統的理解一下所有的網站都叫做web。這個web容器可以把我們的前端(htmlcssjs)和后端(servlet)代碼都運行起來。 Tomcat是一個免費的開源的Servlet容器&#…

Flutter中的三棵樹

Widget Tree&#xff1a; 頁面配置信息。 Element Tree&#xff1a; Widget tree的實例化對象&#xff0c;創建出renderObject&#xff0c;并關聯到element.renderobject屬性上&#xff0c;最后完成RenderObject Tree的創建。 RenderObject Tree&#xff1a;完成布局和圖層繪制…

【C++ 函數重載】

C 函數重載 ■ C 函數重載簡介■ C 運算符重載■ 一元運算符重載■ 二元運算符重載 &#xff08;&#xff0c;-&#xff0c;*&#xff0c;/&#xff09;■ 關系運算符重載 &#xff08; < 、 > 、 < 、 > 、 等等&#xff09;■ 輸入/輸出運算符重載&#xff08;運…

【嵌入式學習】網絡編程day03.02

一、項目 1、TCP機械臂測試 #include <myhead.h> #define SER_IP "192.168.126.32" #define SER_PORT 8888 #define CER_IP "192.168.126.42" #define CER_PORT 9891 int main(int argc, const char *argv[]) {int wfd-1;//創建套接字if((wfdsocke…

ubuntu創建賬號和samba共享目錄

新建用于登錄Ubuntu圖形界面的用戶 sudo su #切換為root用戶獲取管理員權限用于新建用戶 adduser username #新建用戶&#xff08;例如用戶名為username&#xff09; adduser username sudo #將用戶添加到 sudo 組 新建只能用于命令行下登錄的用戶 sudo su #切換為root用戶…

《TCP/IP詳解 卷一》第8章 ICMPv4 和 ICMPv6

目錄 8.1 引言 8.1.1 在IPv4和IPv6中的封裝 8.2 ICMP 報文 8.2.1 ICMPv4 報文 8.2.2 ICMPv6 報文 8.2.3 處理ICMP報文 8.3 ICMP差錯報文 8.3.1 擴展的ICMP和多部報文 8.3.2 目的不可達和數據包太大 8.3.3 重定向 8.3.4 ICMP 超時 8.3.5 參數問題 8.4 ICMP查詢/信息…

劃分開始結束位置設置標記

劃分開始結束位置 初始音軌如下圖所示 在想開始地方單擊左鍵&#xff0c;長按直到你想要的結束位置松開。就可以劃分開始和結束位置 設置標記 方式1 &#xff1a;直接點擊該圖標 方式二&#xff1a;使用快捷鍵M 設置標記點可以自定義名稱方便檢索標記點

javaWebssh酒店客房管理系統myeclipse開發mysql數據庫MVC模式java編程計算機網頁設計

一、源碼特點 java ssh酒店客房管理系統是一套完善的web設計系統&#xff08;系統采用ssh框架進行設計開發&#xff09;&#xff0c;對理解JSP java編程開發語言有幫助&#xff0c;系統具有完整的源代碼和數據庫&#xff0c;系統主要采用B/S模式開發。開發環境為TOMCAT7.0…

STL容器之string類

文章目錄 STL容器之string類1、 什么是STL2、STL的六大組件3、string類3.1、string類介紹3.2、string類的常用接口說明3.2.1、string類對象的常見構造3.2.2、string類對象的容量操作3.2.3、string類對象的訪問及遍歷操作3.2.4、 string類對象的修改操作3.2.5、 string類非成員函…

車輛維護和燃油里程跟蹤器LubeLogger

什么是 LubeLogger &#xff1f; LubeLogger 是一個自托管、開源、基于網絡的車輛維護和燃油里程跟蹤器。 LubeLogger 比較適合用來跟蹤管理您的汽車的維修、保養、加油的歷史記錄&#xff0c;比用 Excel 強多了 官方提供了在線試用&#xff0c;可以使用用戶名 test 和密碼 123…

oracle-long類型轉clob類型及clob類型字段的導出導入

1、若oracle數據庫表字段類型有long類型&#xff0c;有時候我們需要模糊匹配long類型字段時&#xff0c;是查詢不出來結果的&#xff0c;此時使用TO_LOB&#xff0c;將long類型轉成clob類型&#xff0c;就可以模糊匹配信息。 例如&#xff1a;oracle數據庫查詢所有視圖內容中包…

機器學習-4

文章目錄 前言數組創建切片索引索引遍歷切片編程練習 總結 前言 本篇將介紹數據處理 Numpy 庫的一些基本使用技巧&#xff0c;主要內容包括 Numpy 數組的創建、切片與索引、基本運算、堆疊等等。 數組創建 在 Python 中創建數組有許多的方法&#xff0c;這里我們使用 Numpy 中…