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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java装饰模式实例解析

發布時間:2023/12/29 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java装饰模式实例解析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1、裝飾模式概述:

裝飾模式(Decorator Pattern):動態地給一個對象增加一些額外的職責,就增加對象功能來說,裝飾模式比生成子類更為靈活?!对O計模式的藝術》

使用場景:

現實生活中大家都會遇到的一種場景,當買了房子之后,可能都需要對房子進行裝修,或是根據自己的一些喜好對房間進行二次的裝飾來滿足自己的需求。軟件系統開發也如此,一個系統設計好之后,常常需要對系統進行擴展,增加新的業務需求。市場端的需求是善變的,因此在軟件設計時必須要考慮到系統的擴展性,不可能一次性將所有功能做到滿足所有需求。裝飾模式的應用,為系統的擴展以及迭代需求提供很好的支持。

2、裝飾模式UML類圖:

Component(抽象構件):作為具體構件和裝飾類的公共父類,定義相關的業務接口,主要為面向抽象編程;
ConcreteComponent(具體構件):作為抽象構件的子類,為具體業務的實現者;
Decorator(抽象裝飾類):抽象構件的子類,定義為抽象類。用于擴展具體構件的業務功能,作為抽象存在只是為了用戶端使用時面向接口編程。其內部維護一個抽象構件的引用,通過該引用來調用具體構件的方法,并通過其子類來擴展業務方法,實現裝飾的目的。
ConcreteDecorator(具體裝飾類):作為抽象裝飾類的子類,完成對具體構件業務功能的擴展裝飾功能。

3、裝飾模式示例:

項目背景:

咋一看上面的類圖設計,可能體會不到裝飾模式的優雅性,我們通過一個實例,來帶大家體會其中妙處。該實例為某電商平臺活動、扣費相關部分的后臺設計,與前面文章一樣只展示其功能并不上具體代碼啦。

/*** 負責實現各種折扣業務*/ public class DiscountBusiness {/*** 會員9折優惠*/public void discountForVip() {//do something}/*** 51活動優惠*/public void discountForLayborDay() {//do something}/*** 新年活動優惠*/public void discountForSpringFestival() {//do something}/*** vip用戶新年活動優惠*/public void springFestivalDiscountForVip() {//do something}... }

上述代碼為折扣業務邏輯處理類,由于項目初期設計時沒有考慮太多,當業務不斷發展時,運營有各種需求,需要修改原有方案。而程序端實現就是不斷累計代碼,增加新的業務方法和邏輯判斷來進行處理。大家可以想象,幾年下來這類的代碼量那可是非??陀^的,日后做重構或是項目交接,我想接盤的人心里肯定是一萬個草尼瑪飄過。所謂前人種樹后人乘涼,系統設計對于產品發展非常重要,下面我們看使用裝飾模式對該模塊進行重構后的實現。

代理模式實現:

public abstract class BaseDiscount {public abstract void discount(); } public class VIPDiscountBusiness extends BaseDiscount {@Overridepublic void discount() {System.out.println("處理vip用戶的折扣業務");} } public class FestivalDiscountBusiness extends BaseDiscount {@Overridepublic void discount() {System.out.println("處理節假日折扣業務");} } public abstract class DiscountDecorator extends BaseDiscount{public BaseDiscount component;public DiscountDecorator(BaseDiscount component) {this.component = component;} public abstract void discountForVip();public abstract void discountForFestival(); } public class VIPDiscountDecorator extends DiscountDecorator{public VIPDiscountDecorator(BaseDiscount component) {super(component);}@Overridepublic void discount() {component.discount();}@Overridepublic void discountForVip() {component.discount();//do somethingSystem.out.println("擴展Vip用戶折扣業務功能");}@Overridepublic void discountForFestival() {//do nothing} } public class FestivalDiscountDecorator extends DiscountDecorator{public FestivalDiscountDecorator(BaseDiscount component) {super(component);}@Overridepublic void discount() {component.discount();}@Overridepublic void discountForVip() {//do noting}@Overridepublic void discountForFestival() {discount();//do somethingSystem.out.println("擴展節假日折扣業務功能");} }public class Client {public static void main(String[] args) {//客戶端使用BaseDiscount vipDiscountBusiness, festivalDiscountBusiness;vipDiscountBusiness = new VIPDiscountBusiness();festivalDiscountBusiness = new FestivalDiscountBusiness();DiscountDecorator vipDiscountDecorator, festivalDiscountDecorator;vipDiscountDecorator = new VIPDiscountDecorator(vipDiscountBusiness);festivalDiscountDecorator = new FestivalDiscountDecorator(festivalDiscountBusiness);vipDiscountDecorator.discountForVip();festivalDiscountDecorator.discountForFestival();} }

放眼望去,上面代碼好像想比初始時一個類處理完所有功能要復雜的多,結構設計也更抽象化,或許讓人覺得更加難理解。首先將折扣業務劃分為2個類別,并且設計對應的實現者和裝飾者,當業務反之需要對其中的折扣規則進行擴展或者是修改時,并不需要直接修改原有具體實現者的方法,只需要修改VIPDiscountDecorator和FestivalDiscountDecorator等裝飾類中的處理邏輯或者是增加新的接口實現新的業務需求。換句話說不管業務怎么變化,基礎的實現方式不會隨者系統擴展而發生變化,不會破壞原有封裝性。從擴展性和解耦性上來說,這樣的設計會更符合面向對象設計原則,而且這種設計可讀性更高。

4、透明裝飾模式與半透明裝飾模式

兩者之間的區別并不大,透明與否是對客戶端程序而言。上述的示例其實就是透明裝飾模式,因為裝飾類中的接口都定義在抽象類DiscountDecorator中,用戶在使用時面向抽象,所有的接口都是透明的。半透明的就是將具體業務類的裝飾方法定義在具體的裝飾類中,在客戶端使用裝飾類時要直接用具體裝飾類聲明對象,只能使用其業務相關的方法。

5、優缺點分析:

優點:

1)靈活性更好,不用增加特別多子類對原有功能進行擴展;
2)降低系統耦合,面向接口編程,擴展性好;

缺點:

1)設計的理解上會更復雜;

結束語

相信大家對于裝飾模式已有一個初步了解,經常在面試的時候會被問到裝飾模式與代理模式的區別。裝飾模式意義在于對原有系統業務功能的擴展或者是裝飾,而代理模式常用在原有系統中增加一些與業務無關的操作,例如日志、驗證等功能。

總結

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

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