装饰者模式

送分小仙女□ 提交于 2020-01-10 14:10:41

概念

  1. 定义:在不改变原有对象的基础上,动态的给一个对象添加一些额外的职责
  2. 优点:
    (1)装饰类和被装饰类可以独立发展,不相互耦合
    (2)装饰模式是继承关系的一个替代方案
    (3)装饰模式可以动态的扩展一个实现类的功能
  3. 缺点
    (1)多层装饰比较复杂
    (2)出现了更多的类,增加了代码的复杂性
  4. 使用场景
    (1)需要动态的扩展一个类的功能,或给一个类增加附加功能
    (2)需要动态的给一个对象增加功能,这些功能可以再动态的撤销
    (3)需要为一批兄弟类进行改装或加装功能

代码实现

public abstract class IceShake {
  public abstract int cost();

  public String elements() {
    return "ice";
  }
}
public class MongoIceShake extends IceShake {
  @Override
  public int cost() {
    return 10;
  }

  @Override
  public String elements() {
    return super.elements() + ",mongo";
  }
}
public abstract class Decorator extends IceShake {
  private IceShake iceShake;

  public Decorator(IceShake iceShake) {
    this.iceShake = iceShake;
  }

  @Override
  public int cost() {
    return this.iceShake.cost();
  }

  @Override
  public String elements() {
    return this.iceShake.elements();
  }
}
public class FruitDecorator extends Decorator {

  public FruitDecorator(IceShake iceShake) {
    super(iceShake);
  }

  @Override
  public int cost() {
    return super.cost() + 2;
  }

  @Override
  public String elements() {
    return super.elements() + ",fruit";
  }
}
public class NutDecorator extends Decorator {
  public NutDecorator(IceShake iceShake) {
    super(iceShake);
  }

  @Override
  public int cost() {
    return super.cost() + 4;
  }

  @Override
  public String elements() {
    return super.elements() + ",nut";
  }
}
public class Client {
  public static void main(String args[]) {
    //来一份芒果冰沙
    IceShake iceShake = new MongoIceShake();
    //加一份坚果
    iceShake = new NutDecorator(iceShake);
    //加一份水果
    iceShake = new FruitDecorator(iceShake);
    System.out.println("你要的芒果冰沙的成分有:" + iceShake.elements());
    System.out.println("你要的芒果冰沙价格是:" + iceShake.cost());
  }
}

在这里插入图片描述

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!