装饰器是指在不改变先有对象结构的情况下,动态地给该对象增加一些职能(即增加其额外功能)的模式。装饰器模式和代理模式我反正是傻傻分不清。

    装饰器所要完成功能的示意图:
    image.png
    使用套路:

    1. //一层装饰
    2. ExtraFunction extraFunction = new ExtraFunction(new CoreFunction());
    3. extraFunction.do();
    4. //两层装饰
    5. ExtraFunction2 extraFunction2 = new ExtraFunction2(new ExtraFunction(new CoreFunction())();
    6. extraFunction2.do();

    举个例子(装饰器都是这个套路哟~)

    1. 定义一个接口,Skill

      1. public interface Skill {
      2. void ability();
      3. }
    2. JavaSkill是最核心需要掌握的技能

      1. public class JavaSkill implements Skill {
      2. @Override
      3. public void ability() {
      4. System.out.println("java ability");
      5. }
      6. }
    3. 为了掌握更多技能,我们不仅要学习Java,还要学习MyBatis。我们先定义一个装饰器

      1. public class DecoratorSkill implements Skill {
      2. protected Skill skill;
      3. public DecoratorSkill(Skill skill){
      4. this.skill = skill;
      5. }
      6. @Override
      7. public void ability() {
      8. skill.ability();
      9. }
      10. }
    4. 接着让需要增加附加功能的类继承装饰器类DecoratorSkill,并增加额外功能

      1. public class MyBatisSkill extends DecoratorSkill {
      2. public MyBatisSkill(Skill skill) {
      3. super(skill);
      4. }
      5. public void ability() {
      6. System.out.println("mybatis ability");
      7. this.skill.ability();
      8. }
      9. }
    5. 测试

      1. public class Test {
      2. public static void main(String[] args) {
      3. MyBatisSkill myBatisSkill = new MyBatisSkill(new JavaSkill());
      4. myBatisSkill.ability();
      5. }
      6. }

      参考:
      https://www.liaoxuefeng.com/wiki/1252599548343744/1281319302594594