0-前言
裝飾模式定義:動態給一個物件新增一些額外的職責,就增加功能來說,裝飾模式比生成子類更加靈活。
1-實現
1-1、易看的UML圖:
1-2、程式碼實現:
//1、演員類(component,直接實現,未抽取父類,可抽取父類) class Actor { public void Act() { System.out.println("演員開始表演了"); } } //2、Decorator(裝飾抽象類) class Stylist extends Actor { protected Actor actor; public void MakeActor(Actor _actor) { this.actor = _actor; } @Override public void Act() { if (actor !=null) { actor.Act(); } } } //2-1、ConcreteComponentA(具體裝飾者A--古裝造型師) class AncientStylist extends Stylist { private String State; @Override public void Act() { System.out.println("古裝造型師給演員化妝了"); State = "演員狀態挺好的"; System.out.println(State); super.Act(); } } //2-2、ConcreteComponentB(具體裝飾者B) class ModernStylist extends Stylist { public void AddBehaver() { System.out.println("給演員打了個氣"); } @Override public void Act() { System.out.println("現代造型師給演員化妝了"); AddBehaver(); super.Act(); }
客戶端:
Actor actor = new Actor(); AncientStylist ancientStylist =new AncientStylist(); ModernStylist modernStylist = new ModernStylist(); ancientStylist.MakeActor(actor); ancientStylist.Act(); modernStylist.MakeActor(actor); modernStylist.Act();
執行結果:
2、應用場景簡單總結
1、當需要以不影響其他物件為前提實現動態、透明地給單個物件新增職責時;
2、當需要將物件的某些職責進行撤銷操作時;
3、當不能用生成子類的方法進行當前系統的擴充時;