[设计模式] ------ 装饰模式
首先,假設項目有個核心功能。
隨著項目迭代,又產生功能1和功能2
于是有如下需求:
某個場景需要核心功能和功能1組合,
某個場景需要核心功能和功能2組合,
某個場景需要核心功能和功能1和功能2組合,
甚至以后有了功能3,某個場景要核心功能和功能1和功能3組合。
那么這種情況,就要使用裝飾模式,為已有核心功能按一定順序動態增加其他功能。
使用裝飾模式,優點在于區分核心功能和其他裝飾功能。而且按照裝飾模式的套路寫,可以將功能的組裝看成一條鏈,一個個的將各個功能動態的穿起來。
具體實現
下面舉個例子:
比如一輛車,核心功能就是跑起來。
同時我們再為車裝飾一些牛逼的其他功能,
比如功能1就是飛起來,
功能2就是游泳
功能3就是跳起來
接下來我們使用裝飾模式,來將這些功能一個個的裝飾在這輛車上。
(也可以先看后面代碼,照著代碼再看下面的步驟)
第一步:
我們需先定義一個接口ICar,有兩個方法,一個是show,一個是run
show方法,就是用于以后多個裝飾器之間的連接,run方法就是核心的跑方法。
第二步:
定義一個類RunICar,實現接口ICar,這就是輛真正的車了。
重寫run方法,里面就是具體的核心實現。
重寫show方法,里面只做一件事,就是調用run方法。
至此,一個初期的車就做出來了。
第三步:
定義一個抽象類ICarDecoeator,實現接口ICar,這個抽象類就是我們所說的裝飾類的抽象類。
抽象類中定義一個成員變量ICar,引用是個接口,具體是哪個實現類,就看傳哪個實現類了,也是為了后續調用ICar的方法,就直接調到傳的那個實現類中了。
再定義一個有參構造方法,入參就是接口ICar,實現就是將入參賦給類中的成員變量ICar。
第四步:
這下就是真正的裝逼功能的實現了。
定義類FlyDecorator,繼承第三步中的抽象類ICarDecoeator
定義有參構造方法,傳入ICar,并傳給父類,即super(iCar),
定義本類的裝飾功能,比如創建方法fly(),具體實現就是飛起來
同時重寫run方法和show方法。
run方法可以為空
重點是show方法,這可是裝飾模式的精髓所在。
show方法有兩步,第一步是獲取ICar引用,并調用iCar的show方法,這樣就相當于傳進來的ICar的調用,也就是這一步,才讓裝飾模式真正的鏈起來了。
show的第二部,是調用自己特有的方法,fly()。
第五步
同第四步,再定義實現類SwinDecorator,繼承ICarDecoeator
定義有參構造方法,傳入ICar,并傳給父類,即super(iCar),
定義本類的裝飾功能,比如創建方法swin(),具體實現就是游泳
同時重寫run方法和show方法。
run方法可以為空
show也是先獲取父類成員變量ICar,并調用show方法。再調用自己的方法swin()
第六步
同第四步,再定義實現類JumpDecorator,繼承ICarDecoeator
定義有參構造方法,傳入ICar,并傳給父類,即super(iCar),
定義本類的裝飾功能,比如創建方法jump(),具體實現就是跳起來
同時重寫run方法和show方法。
run方法可以為空
show也是先獲取父類成員變量ICar,并調用show方法。再調用自己的方法jump()
第七步
第四五六步,都是裝飾的附加功能,至此,所有準備工作就完了
第七步來測試下。
先來個核心功能RunICar,車就能跑了。
如果再想實現飛的功能,就new一個FlyDecorator,并將RunICar傳入FlyDecorator的有參構造,調用show方法即可。
如果不但想跑,想飛,還想游泳,就再new一個SwinDecorator,并將FlyDecorator傳入SwinDecorator的有參構造,調用show方法即可。
如果不但想跑,想飛,想游泳,還想跳,就再new一個JumpDecorator,并將之前能跑能飛能游泳的SwinDecorator傳入JumpDecorator的有參構造,調用show方法即可。
接下來是代碼示例:
public interface ICar {public void show();public void run();} public class RunICar implements ICar {@Overridepublic void show() {this.run();}@Overridepublic void run() {//核心功能實現System.out.println("車輛可以跑");} } public abstract class ICarDecoeator implements ICar {//2.抽象裝飾類包含抽象組件的一個引用。作用:裝飾類給傳遞進來的組件添加新的功能private ICar icar;//有參構造方法用于獲取組件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) {/**使用裝飾模式,給具體組件添加功能。在用戶需要什么功能,就將具體組件作為參數傳遞為具體裝飾類。客戶端在調用時,是以透明的方式擴展對象功能,是繼承關系的一種替換。*/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();//跑,游,飛,跳} }總結
以上是生活随笔為你收集整理的[设计模式] ------ 装饰模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 赶紧看一下mysql8.0版本的新特性,
- 下一篇: 微型计算机的应用特点,微型计算机的特点及