裝飾器模式是為已有功能動態(tài)的添加更多功能的一種方式个曙。
-
優(yōu)點(diǎn):
有效的把類的核心職責(zé)和裝飾功能區(qū)分開鹊杖,職責(zé)更細(xì)化
-
UML
-
code
public interface Apple { /** * 描述 */ void res(); }
public class ConcreteApple implements Apple { @Override public void res() { System.out.println("普通的蘋果"); } }
-
裝飾器基類
public abstract class Decorator implements Apple { protected Apple apple; public Decorator(Apple apple) { super(); this.apple = apple; } @Override public void res() { apple.res(); } }
public class ConcreteDecoratorA extends Decorator{ public ConcreteDecoratorA(Apple apple) { super(apple); } public void resA(){ System.out.println("被裝飾器A擴(kuò)展的功能"); } @Override public void res(){ System.out.println("裝飾器A=>裝飾成紅色的"); super.res(); System.out.println("裝飾器A=>裝飾結(jié)束"); } }
public class ConcreteDecoratorB extends Decorator{ public ConcreteDecoratorB(Apple apple) { super(apple); } public void resB(){ System.out.println("被裝飾器B擴(kuò)展的功能"); } @Override public void res(){ System.out.println("裝飾器B=>裝飾成綠色的"); super.res(); System.out.println("裝飾器B=>裝飾結(jié)束"); } }
-
測試
** * @author tanoak@qq.com * @date 2018/7/26 14:08 * @Desc 裝飾器模式 * 1,不改變原類文件。 * 2咳蔚,不使用繼承端三。 * 3,動態(tài)擴(kuò)展细卧。 */ public class Main { public static void main(String[] args) { Apple apple =new ConcreteApple(); System.out.println("-----------未裝飾-------------------\n"); apple.res();//原來的方法 System.out.println("------------------------------------\n"); test2(apple) ; } private static void test2(Apple apple){ ConcreteDecoratorB decoratorB = new ConcreteDecoratorB(apple); System.out.println("\n-----------裝飾后-------------------\n"); decoratorB.res(); System.out.println("------------------------------"); } }
總結(jié)
-
使用場景
當(dāng)系統(tǒng)需要增加新功能時(shí)尉桩,向舊的類中添加新的代碼,裝飾原有類的核心職責(zé)或主要行為 eg: 在上述代碼中 我想要對蘋果的顏色進(jìn)行包裝贪庙,但是也會存在不進(jìn)行包裝的情況蜘犁,核心邏輯是蘋果,其次是對蘋果進(jìn)行裝飾
-
-
-