Decorator(装饰)
意图:
动态地给 一个对象添加一些额外的职责。就添加功能来说,Decorator模式相比生成子类更为灵活。
类图:
代码:
/** * * @ClassName: CheeseCake * @Description: 蛋糕实现类 * @author 雨ゆこ * @date 2018年5月1日 * @version yuko1.0 */ public class CheeseCake extends Cake{ @Override public void show() { System.out.println("CheeseCake"); } }
/** * * @ClassName: Cake * @Description: 抽象蛋糕类 * @author 雨ゆこ * @date 2018年5月1日 * @version yuko1.0 */ public abstract class Cake { public abstract void show(); }
/** * * @ClassName: CheeseCake * @Description: 蛋糕实现类 * @author 雨ゆこ * @date 2018年5月1日 * @version yuko1.0 */ public class CheeseCake extends Cake{ @Override public void show() { System.out.println("CheeseCake"); } }
/** * * @ClassName: FruitCake * @Description: 蛋糕实现类 * @author 雨ゆこ * @date 2018年5月1日 * @version yuko1.0 */ public class FruitCake extends Cake{ @Override public void show() { System.out.println("FruitCake"); } }
/** * * @ClassName: Decorator * @Description: 蛋糕实现类 蛋糕装饰器 * @author 雨ゆこ * @date 2018年5月1日 * @version yuko1.0 */ public abstract class Decorator extends Cake { Cake cake; public Decorator(Cake cake) { this.cake = cake; } @Override public void show() { cake.show(); funExtends(); } public abstract void funExtends(); }
/** * * @ClassName: WithFlag * @Description: 蛋糕装饰器实现类 * @author 雨ゆこ * @date 2018年5月1日 * @version yuko1.0 */ public class WithFlag extends Decorator{ public WithFlag(Cake cake) { super(cake); } @Override public void funExtends() { System.out.println("FunExtends"); } }
/** * * @ClassName: WithFlower * @Description: 蛋糕装饰器实现类 * @author 雨ゆこ * @date 2018年5月1日 * @version yuko1.0 */ public class WithFlower extends Decorator{ public WithFlower(Cake cake) { super(cake); } @Override public void funExtends() { System.out.println("WithFlower"); } }
/** * * @ClassName: Yufan * @Description: 装饰器测试类 * @author 雨ゆこ * @date 2018年5月1日 * @version yuko1.0 */ public class Yufan { public static void main(String[] args) { Cake c = new WithFlag(new FruitCake()); Cake c1 = new WithFlower(new CheeseCake()); c.show(); c1.show(); } }
测试结果:
个人理解:
对原来接口的功能进行扩展,添加上新的功能。
装饰器 本身就是该接口的 一个实现。同时需要兼容其他实现,所以提供了一个带参数的构造方法。
在接口的基础上利用抽象来进行扩展。