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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

[设计模式] ------ 装饰模式

發(fā)布時間:2024/7/23 asp.net 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [设计模式] ------ 装饰模式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

首先,假設(shè)項目有個核心功能。
隨著項目迭代,又產(chǎn)生功能1和功能2
于是有如下需求:
某個場景需要核心功能和功能1組合,
某個場景需要核心功能和功能2組合,
某個場景需要核心功能和功能1和功能2組合,
甚至以后有了功能3,某個場景要核心功能和功能1和功能3組合。

那么這種情況,就要使用裝飾模式,為已有核心功能按一定順序動態(tài)增加其他功能。
使用裝飾模式,優(yōu)點在于區(qū)分核心功能和其他裝飾功能。而且按照裝飾模式的套路寫,可以將功能的組裝看成一條鏈,一個個的將各個功能動態(tài)的穿起來。

具體實現(xiàn)

下面舉個例子:
比如一輛車,核心功能就是跑起來。
同時我們再為車裝飾一些牛逼的其他功能,
比如功能1就是飛起來,
功能2就是游泳
功能3就是跳起來

接下來我們使用裝飾模式,來將這些功能一個個的裝飾在這輛車上。
(也可以先看后面代碼,照著代碼再看下面的步驟)

第一步:

我們需先定義一個接口ICar,有兩個方法,一個是show,一個是run
show方法,就是用于以后多個裝飾器之間的連接,run方法就是核心的跑方法。

第二步:

定義一個類RunICar,實現(xiàn)接口ICar,這就是輛真正的車了。
重寫run方法,里面就是具體的核心實現(xiàn)。
重寫show方法,里面只做一件事,就是調(diào)用run方法。
至此,一個初期的車就做出來了。

第三步:

定義一個抽象類ICarDecoeator,實現(xiàn)接口ICar,這個抽象類就是我們所說的裝飾類的抽象類。
抽象類中定義一個成員變量ICar,引用是個接口,具體是哪個實現(xiàn)類,就看傳哪個實現(xiàn)類了,也是為了后續(xù)調(diào)用ICar的方法,就直接調(diào)到傳的那個實現(xiàn)類中了。
再定義一個有參構(gòu)造方法,入?yún)⒕褪墙涌贗Car,實現(xiàn)就是將入?yún)①x給類中的成員變量ICar。

第四步:

這下就是真正的裝逼功能的實現(xiàn)了。
定義類FlyDecorator,繼承第三步中的抽象類ICarDecoeator
定義有參構(gòu)造方法,傳入ICar,并傳給父類,即super(iCar),
定義本類的裝飾功能,比如創(chuàng)建方法fly(),具體實現(xiàn)就是飛起來
同時重寫run方法和show方法。
run方法可以為空
重點是show方法,這可是裝飾模式的精髓所在。
show方法有兩步,第一步是獲取ICar引用,并調(diào)用iCar的show方法,這樣就相當于傳進來的ICar的調(diào)用,也就是這一步,才讓裝飾模式真正的鏈起來了。
show的第二部,是調(diào)用自己特有的方法,fly()。

第五步

同第四步,再定義實現(xiàn)類SwinDecorator,繼承ICarDecoeator
定義有參構(gòu)造方法,傳入ICar,并傳給父類,即super(iCar),
定義本類的裝飾功能,比如創(chuàng)建方法swin(),具體實現(xiàn)就是游泳
同時重寫run方法和show方法。
run方法可以為空
show也是先獲取父類成員變量ICar,并調(diào)用show方法。再調(diào)用自己的方法swin()

第六步

同第四步,再定義實現(xiàn)類JumpDecorator,繼承ICarDecoeator
定義有參構(gòu)造方法,傳入ICar,并傳給父類,即super(iCar),
定義本類的裝飾功能,比如創(chuàng)建方法jump(),具體實現(xiàn)就是跳起來
同時重寫run方法和show方法。
run方法可以為空
show也是先獲取父類成員變量ICar,并調(diào)用show方法。再調(diào)用自己的方法jump()

第七步

第四五六步,都是裝飾的附加功能,至此,所有準備工作就完了
第七步來測試下。
先來個核心功能RunICar,車就能跑了。
如果再想實現(xiàn)飛的功能,就new一個FlyDecorator,并將RunICar傳入FlyDecorator的有參構(gòu)造,調(diào)用show方法即可。
如果不但想跑,想飛,還想游泳,就再new一個SwinDecorator,并將FlyDecorator傳入SwinDecorator的有參構(gòu)造,調(diào)用show方法即可。
如果不但想跑,想飛,想游泳,還想跳,就再new一個JumpDecorator,并將之前能跑能飛能游泳的SwinDecorator傳入JumpDecorator的有參構(gòu)造,調(diào)用show方法即可。

接下來是代碼示例:

public interface ICar {public void show();public void run();} public class RunICar implements ICar {@Overridepublic void show() {this.run();}@Overridepublic void run() {//核心功能實現(xiàn)System.out.println("車輛可以跑");} } public abstract class ICarDecoeator implements ICar {//2.抽象裝飾類包含抽象組件的一個引用。作用:裝飾類給傳遞進來的組件添加新的功能private ICar icar;//有參構(gòu)造方法用于獲取組件public ICarDecoeator(ICar icar) {super();this.icar = icar;}public ICar getIcar() {return icar;}public void setIcar(ICar icar) {this.icar = icar;} } public class FlyDecorator extends ICarDecoeator {public FlyDecorator(ICar icar) {super(icar);}public void fly() {System.out.println("車輛可以飛");}public void show() {this.getIcar().show();this.fly();}@Overridepublic void run() {} } public class SwinDecorator extends ICarDecoeator {public SwinDecorator(ICar icar) {super(icar);}public void swin() {System.out.println("可以潛水");}@Overridepublic void run() {}@Overridepublic void show() {this.getIcar().show();this.swin();} } public class JumpDecorator extends ICarDecoeator {public JumpDecorator(ICar iCar){super(iCar);}@Overridepublic void show() {this.getIcar().show();this.jump();}public void jump(){System.out.println("車可以跳");}@Overridepublic void run() {} } public class DecoratorMain {public static void main(String[] args) {/**使用裝飾模式,給具體組件添加功能。在用戶需要什么功能,就將具體組件作為參數(shù)傳遞為具體裝飾類。客戶端在調(diào)用時,是以透明的方式擴展對象功能,是繼承關(guān)系的一種替換。*/ICar icar = new RunICar();ICar flyicar = new FlyDecorator(icar);flyicar.show();//跑,飛System.out.println("------------");ICar swinicar = new SwinDecorator(icar);swinicar.show();//跑,游System.out.println("-----------");ICar swin = new SwinDecorator(flyicar);swin.show();//跑,飛,游System.out.println("-----------");ICar flyDecorator = new FlyDecorator(swinicar);flyDecorator.show();//跑,游,飛System.out.println("------------");ICar jumpDecorator = new JumpDecorator(flyDecorator);jumpDecorator.show();//跑,游,飛,跳} }

總結(jié)

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

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