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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

设计模式之装饰模式(Java实现)

發(fā)布時間:2023/11/27 生活经验 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式之装饰模式(Java实现) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

 “怎么了,魚哥?”

  “唉,別提了,網(wǎng)購了一件衣服,結(jié)果發(fā)現(xiàn)和商家描述的差太多了,有色差就算了,質(zhì)量還不好,質(zhì)量不好就算了,竟然大小也不行,說好的3個X,郵的卻是一個X的,不說了,退貨去。你先開講吧,你說說就一個東西還裝飾個什么勁兒?!?#xff08;裝飾模式石化中:這關我什么事兒撒。)恩,今天由我來講,講之前先來個段子:話說面條被追到一個理發(fā)店,出來一個方便面,然后追他的人一把抓住他就開打:小子(第四聲),燙個頭發(fā)我就不認識你了么?其實那人認錯了,出來的真的是方便面,我認識的,因為方便面屁股上有胎記,恩。然后為什么會認錯呢?沒錯,就是他認為面條“裝飾了一下”。好了,我就是裝飾。不過魚哥的衣服真的不怨我、、、

裝飾模式之自我介紹

  先來看下有關我的定義:Attach additional responsibilities to an object dynamically keeping the same interface. Decorators provide a flexible alternative to subclassing for extending functionality.翻譯過來的意思就是動態(tài)的給一個對象添加一些額外的職責。就增加功能來說,裝飾模式想比生成子類更為靈活。下面的是我的類圖:

?  Component是定義一個對象接口,可以給這些對象動態(tài)的添加職責,ConcreteComponent是定義了一個具體的對象,也可以給這個對象添加一些職責。Decorator,裝飾抽象類,繼承了Component從外類來擴展Component類的功能,但對于Component來說,是無需知道Decorator的存在,至于ConcreteDecorator就是具體的裝飾對象,起到給Component添加職責的功能。(裝飾模式:容我抽根煙,喝杯水)

  講到哪里來著?哦,想起來了。接下來我就談談Advantages和Disadvantages吧。

裝飾模式之自我分析

  我嘛,比較均衡,何為均衡呢,就是優(yōu)點和缺點一半一半,主要優(yōu)點兩個,如下:

  • 比靜態(tài)繼承更為靈活。比如說可以用添加和分離的方法,用裝飾在運行時刻增加和刪除職責。
  • 可以避免在層次結(jié)構(gòu)高層的類有太多的特征。

  主要缺點:

  • Decorator與它的Component不一樣。Decorator是一個透明的包裝,如果從對象標識觀點出發(fā),一個被裝飾的組件與此組件有差別。因此不能依賴對象標識。
  • 使用裝飾模式會產(chǎn)生很多小的對象。這對于它來說很難進行訂制。而且排錯也很困難。

裝飾模式之實現(xiàn)

  光說不練假把式,既然如此,我就給你們露一手,這次就拿面條燙發(fā)來當栗子,首先是面條的抽象類:

1 public abstract class Noodles{
2     //抽象方法
3     public abstract void say();
4 }

  抽象類比較簡單,只有一say的屬性,接下來是具體的面條的類的實現(xiàn):

1 public  class sayNoodles extends Noodles{
2     //抽象方法
3     @Override
4     public void say(){
5         System.out.println("我是面條");
6     }
7 }

  他主要就是實現(xiàn)了抽象類的方法,描述自己是面條,不是其它的東西。接下來的就比較有意思了,就是這次的重點抽象類,裝飾,一般都是把裝飾類作為一個抽象類,因為要裝飾的東西不僅僅只有一種, 可能裝飾很多東西,比如說一個面條可以先燙發(fā),在染發(fā),然后焗一下等等,寫到一個實現(xiàn)類的話就太臃腫,不利于擴展等,所以最好用一個抽象類,然后具體實現(xiàn)不同的裝飾再具體子類實現(xiàn),下面就是一個裝飾的抽象類: 

1 public abstract class Decorator extends Noodels{2     private Noodels noodles = null;3     //通過構(gòu)造函數(shù)傳遞被修飾的東西4     public Decorator(Noodels nood)5     {6         this.noodles = nood;7     }8 9     //委托給被修飾著執(zhí)行
10     @Override
11     public void say(){
12         this.noodles.say();
13     }
14 
15 }

  接下來就是一個實現(xiàn)給面條燙發(fā),大變方便面的裝飾類了:

public class ConcreteDecorator extends Decorator{2     //定義被修飾者3     public ConcreteDecorator(Noodles nood){4         super(nood);5     }6 7     //定義自己的修飾方法8 9     private void dsay(){
10         System.out.println("我燙了頭發(fā)");
11     }
12 
13     //重寫父類方法
14     public void say(){
15         this.dsay();
16         super.say();
17     }
18 
19 }

 1 public class ConcreteDecorator extends Decorator{2     //定義被修飾者3     public ConcreteDecorator(Noodles nood){4         super(nood);5     }6 7     //定義自己的修飾方法8 9     private void dsay(){
10         System.out.println("我燙了頭發(fā)");
11     }
12 
13     //重寫父類方法
14     public void say(){
15         this.dsay();
16         super.say();
17     }
18 
19 }

  接下來可以通過測試類測試一下裝飾后的效果:

1 public class Test{
2     public static void main(String[] args) {
3         Noodels noodels = new sayNoodles();
4         //進行裝飾,燙發(fā)開始
5         noodels = new ConcreteDecorator(noodels);
6         noodels.say();
7     }
8 }

  好了,有關裝飾模式的到此就沒了。欲知后式(此為模式)如何,且聽下回分解~(作者按:臥槽,竟然搶我臺詞,別理我,我想靜靜,別問我靜靜是誰)

裝飾模式之應用場景

  • 不影響其他對象的情況下,以動態(tài)、透明的方式給單個對象增加職責。
  • 處理可以撤銷的職責

轉(zhuǎn)載于:https://www.cnblogs.com/yudar/p/4265264.html

總結(jié)

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

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