设计模式之装饰模式(Java实现)
“怎么了,魚哥?”
“唉,別提了,網(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 钢琴班多少钱啊?
- 下一篇: js里的匿名函数 数组排序