• 装饰者模式


    一、定义

     动态的给对象添加一些额外的属性或行为。相比于使用继承,装饰者模式更加灵活。

    • Component:装饰者和被装饰者共同的父类,是一个接口或者抽象类,用来定义基本行为
    • ConcreteComponent:定义具体对象,即被装饰者
    • Decorator:抽象装饰者,继承自Component,从外类来扩展ConcreteComponent。对于ConcreteComponent来说,不需要知道Decorator的存在,Decorator是一个接口或抽象类
    • ConcreteDecorator:具体装饰者,用于扩展ConcreteComponent
    举个例子:
    假设一家甜品店,出售蛋糕,除了蛋糕外,还可以在蛋糕上布置水果,蜡烛等,但是水果和蜡烛需要额外收费,**假设一个蛋糕的价格是66元,水果和蜡烛分别需要额外付10元,那么怎么样来动态的计算价格呢? 首先定义组件类,也是装饰者和被装饰者的超类Sweet .java
    1 public abstract class Sweet {
    2     String description = "Sweet";
    3 
    4     public String getDescription() {
    5         return description;
    6     }
    7 
    8     public abstract double cost();
    9 }

    定义被装饰者蛋糕类,Cake .java

     1 public class Cake extends Sweet {
     2     @Override
     3     public String getDescription() {
     4         return "一个蛋糕";
     5     }
     6 
     7     @Override
     8     public double cost() {
     9         return 66;
    10     }
    11 }

    定义抽象装饰者类Decorator.java

    1 public abstract class Decorator extends Sweet {
    2     public abstract String getDescription();
    3 }

    定义具体装饰者水果类,FruitDecorator.java

     1 public class FruitDecorator extends Decorator {
     2     Sweet sweet;
     3 
     4     public FruitDecorator(Sweet sweet) {
     5         this.sweet = sweet;
     6     }
     7 
     8     @Override
     9     public String getDescription() {
    10         return sweet.getDescription() + ",水果";
    11     }
    12 
    13     @Override
    14     public double cost() {
    15         return sweet.cost() + 10;
    16     }
    17 }

    定义具体装饰者蜡烛类,CandleDecorator.java

     1 public class CandleDecorator extends Decorator {
     2     Sweet sweet;
     3 
     4     public CandleDecorator(Sweet sweet) {
     5         this.sweet = sweet;
     6     }
     7 
     8     @Override
     9     public String getDescription() {
    10         return sweet.getDescription() + ",蜡烛";
    11     }
    12 
    13     @Override
    14     public double cost() {
    15         return sweet.cost() + 10;
    16     }
    17 }

    最后根据不同的选择来结算价格

     1 public static void main(String[] args) {
     2 
     3     Cake cake = new Cake();
     4     System.out.println(cake.getDescription() + "总共花费" + cake.cost());
     5 
     6     FruitDecorator fruitDecorator = new FruitDecorator(cake);
     7     System.out.println(fruitDecorator.getDescription() + "总共花费" + fruitDecorator.cost());
     8 
     9     CandleDecorator candleDecorator = new CandleDecorator(fruitDecorator);
    10     System.out.println(candleDecorator.getDescription() + "总共花费" + candleDecorator.cost());
    11 
    12     }

    参考:

    https://juejin.im/post/5a33e7d76fb9a045167d412c



  • 相关阅读:
    Grafana 监控系统是否重启
    Grafana 短信报警
    Python 协程检测Kubernetes服务端口
    python过滤 Kubernetes api数据
    django 实现文件下载功能
    python tar.gz格式压缩、解压
    kafka查看消费数据
    SublimeText设置在浏览器打开 快捷键
    php如何优雅地把数组传递给前端js脚本?
    jQuery因mouseover,mouseout冒泡产生的闪烁问题
  • 原文地址:https://www.cnblogs.com/wylwyl/p/10496480.html
Copyright © 2020-2023  润新知