装饰着模式
1、定义:再不改变原有对象的基础之上,将功能附加到对象上
提供了比继承更有弹性的替代方案(扩展原有对象功能)
类型:结构型
2、适用场景
扩展一个类的功能或给一个类添加附加职责
动态的给一个对象添加功能,这些功能可以再动态的撤销
3、优点
继承的有力补充,比继承灵活,不改变原有对象的情况下给一个对象扩展功能
通过使用不同装饰类以及这些装饰类的排列组合,可以实现不同效果
符合开闭原则
4、缺点
会出现更多的代码,更多的类,增加程序复杂性
动态装饰时,多层装饰时会更加复杂
5、实现
/** * @description 抽象类 * @author: hq * @create: 2022-08-28 15:42 **/ public abstract class ABattercake { public abstract String getDesc(); public abstract int cost(); }
/** * @description 煎饼 * @author: hq * @create: 2022-08-28 15:44 **/ public class Battercake extends ABattercake { @Override public String getDesc() { return "煎饼"; } @Override public int cost() { return 8; } }
/** * @description * @author: hq * @create: 2022-08-28 15:45 **/ public class AbstractDecorator extends ABattercake { private ABattercake battercake; public AbstractDecorator(ABattercake battercake) { this.battercake = battercake; } @Override public String getDesc() { return battercake.getDesc(); } @Override public int cost() { return battercake.cost(); } }
/** * @description * @author: hq * @create: 2022-08-28 20:39 **/ public class EggDecorator extends AbstractDecorator { public EggDecorator(ABattercake battercake) { super(battercake); } @Override public String getDesc() { return super.getDesc() + " 加一个鸡蛋"; } @Override public int cost() { return super.cost() + 1; } }
/** * @description * @author: hq * @create: 2022-08-28 20:40 **/ public class SausageDecorator extends AbstractDecorator { public SausageDecorator(ABattercake battercake) { super(battercake); } @Override public String getDesc() { return super.getDesc() + " 加一根香肠"; } @Override public int cost() { return super.cost() + 2; } }
/** * @description * @author: hq * @create: 2022-08-28 20:42 **/ public class Test { public static void main(String[] args) { ABattercake battercake; battercake = new Battercake(); battercake = new EggDecorator(battercake); battercake = new SausageDecorator(battercake); battercake = new SausageDecorator(battercake); System.out.println(battercake.getDesc()); System.out.println(battercake.cost()); } }