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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java描述设计模式(09):装饰模式

發(fā)布時間:2025/3/17 java 12 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java描述设计模式(09):装饰模式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本文源碼:GitHub·點這里 || GitEE·點這里

一、生活場景

1、場景描述

孫悟空有七十二般變化,他的每一種變化都給他帶來一種附加的本領(lǐng)。他變成魚兒時,就可以到水里游泳;他變成鳥兒時,就可以在天上飛行。

2、場景圖解

3、代碼實現(xiàn)

public class C01_InScene {public static void main(String[] args) {TheGreatestSage greatestSage = new Monkey();TheGreatestSage fish = new Fish(greatestSage);fish.shapeDesc();// 這里雖然是魚形態(tài),但是本體是悟空,所以可以直接變化TheGreatestSage bird = new Bird(fish);bird.shapeDesc();} } // 頂級接口 interface TheGreatestSage {// 定義一個描述形態(tài)的方法void shapeDesc (); } // 悟空本尊 class Monkey implements TheGreatestSage{@Overridepublic void shapeDesc() {System.out.println("Monkey.move()");} } // 包裝一層變化的描述 class Change implements TheGreatestSage {private TheGreatestSage greatestSage;Change(TheGreatestSage greatestSage){this.greatestSage = greatestSage;}@Overridepublic void shapeDesc() {greatestSage.shapeDesc();} } // 具體的變化形態(tài) class Fish extends Change{public Fish(TheGreatestSage greatestSage) {super(greatestSage);}public void shapeDesc(){System.out.println("魚在水中游...");} } class Bird extends Change{public Bird(TheGreatestSage greatestSage) {super(greatestSage);}public void shapeDesc(){System.out.println("鳥在空中飛...");} }

二、裝飾模式

1、基礎(chǔ)概念

裝飾模式又名包裝(Wrapper)模式。裝飾模式以對客戶端透明的方式擴展對象的功能,是繼承關(guān)系的一個替代方案。
裝飾模式以對客戶透明的方式動態(tài)地給一個對象附加上更多的責(zé)任。換言之,客戶端并不會覺得對象在裝飾前和裝飾后有什么不同。裝飾模式可以在不使用創(chuàng)造更多子類的情況下,將對象的功能加以擴展。

2、核心角色

  • 抽象構(gòu)件角色

給出一個抽象接口,以規(guī)范準(zhǔn)備接收附加責(zé)任的對象。

  • 具體構(gòu)件角色

定義一個將要接收附加責(zé)任的類。

  • 裝飾角色

持有一個構(gòu)件對象的實例,并定義一個與抽象構(gòu)件接口一致的接口。

  • 具體裝飾角色

負(fù)責(zé)給構(gòu)件對象“貼上”附加的責(zé)任。

3、模式圖解

4、源代碼實現(xiàn)

// 抽象構(gòu)件角色 interface Component {void sampleOperation(); } // 具體構(gòu)件角色 class ConcreteComponent implements Component{@Overridepublic void sampleOperation() {System.out.println("業(yè)務(wù)相關(guān)代碼");} } //裝飾角色 class Decorator implements Component{private Component component;public Decorator(Component component){this.component = component;}@Overridepublic void sampleOperation() {//委派給構(gòu)件進行處理component.sampleOperation();} } // 具體裝飾角色 class ConcreteDecoratorA extends Decorator{public ConcreteDecoratorA(Component component) {super(component);}@Overridepublic void sampleOperation() {super.sampleOperation();System.out.println("A.處理相關(guān)業(yè)務(wù)的代碼");} } class ConcreteDecoratorB extends Decorator{public ConcreteDecoratorB(Component component) {super(component);}@Overridepublic void sampleOperation() {super.sampleOperation();System.out.println("B.處理相關(guān)業(yè)務(wù)方法");} }

5、該模式簡化

  • 簡化抽象類

如果只有一個ConcreteComponent類,那么可以考慮去掉抽象的Component類(接口),把Decorator作為一個ConcreteComponent子類。

  • 簡化裝飾類

如果只有一個ConcreteDecorator類,那么就沒有必要建立一個單獨的Decorator類,而可以把Decorator和ConcreteDecorator的責(zé)任合并成一個類。

6、半透明說明

1)、純粹的裝飾模式很難找到。裝飾模式的用意是在不改變接口的前提下,增強類的功能。

2)、在增強功能的時候,往往需要建立新的公開的方法。

3)、這就導(dǎo)致了大多數(shù)的裝飾模式的實現(xiàn)都是“半透明”的,而不是完全透明的。換言之,允許裝飾模式改變接口,增加新的方法。這意味著客戶端可以聲明ConcreteDecorator類型的變量,從而可以調(diào)用ConcreteDecorator類中才有的方法。

4)、半透明的裝飾模式是介于裝飾模式和適配器模式之間的。適配器模式的用意是改變類的接口,也可以通過改寫一個或幾個方法,或增加新的方法來增強類的功能。

5)、大多數(shù)的裝飾模式實際上是半透明的裝飾模式,這樣的裝飾模式也稱做半裝飾、半適配器模式。

三、實際應(yīng)用

1、JDK中IO流

1)、基本描述

裝飾模式在Java語言中的最經(jīng)典的應(yīng)用就是Java I/O類庫的設(shè)計。很少單一的創(chuàng)建流對象,通過創(chuàng)建多個疊合對象來提供所期望的IO流功能,因此裝飾模式是Java I/O類庫的基本模式。

2)、IO流圖解描述

  • 抽象構(gòu)件角色

由InputStream扮演。這是一個抽象類,為各種子類型提供統(tǒng)一的接口。

  • 具體構(gòu)件角色

由FileInputStream、StringBufferInputStream等類扮演。它們實現(xiàn)了抽象構(gòu)件角色所規(guī)定的接口。

  • 抽象裝飾角色

由FilterInputStream扮演。它實現(xiàn)了InputStream所規(guī)定的接口。

  • 具體裝飾角色

由幾個類扮演,分別是BufferedInputStream、DataInputStream以及兩個不常用到的類LineNumberInputStream、PushbackInputStream。

四、優(yōu)缺點總結(jié)

1、模式的優(yōu)點

(1)裝飾模式與繼承關(guān)系的目的都是要擴展對象的功能,但是裝飾模式可以提供比繼承更多的靈活性。裝飾模式允許系統(tǒng)動態(tài)決定“貼上”一個需要的“裝飾”,或者除掉一個不需要的“裝飾”。繼承關(guān)系則不同,繼承關(guān)系是靜態(tài)的,它在系統(tǒng)運行前就決定了。

(2)通過使用不同的具體裝飾類以及這些裝飾類的排列組合,工程師可以創(chuàng)造出很多不同行為的組合。

2、模式的優(yōu)點

由于使用裝飾模式,可以比使用繼承關(guān)系需要較少數(shù)目的類。使用較少的類,當(dāng)然使設(shè)計比較易于進行。但是,在另一方面,使用裝飾模式會產(chǎn)生比使用繼承關(guān)系更多的對象。

五、源代碼地址

GitHub地址:知了一笑 https://github.com/cicadasmile/model-arithmetic-parent 碼云地址:知了一笑 https://gitee.com/cicadasmile/model-arithmetic-parent

總結(jié)

以上是生活随笔為你收集整理的Java描述设计模式(09):装饰模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。