装饰器模式

装饰器模式

什么是装饰器模式:

是一种结构型设计模型,允许在不改变对象结构的情况下,动态的将新的功能添加到对象上,

核心思想:

通过组合而非继承的方式来实现功能扩展。他可以在运行时动态的添加活移除对象的功能,而无需修改原始对象的代码。

解决的问题:

继承关系过于复杂的问题,通过组合来代替继承。

使用场景:

用于扩展一个类的功能,或者给一个类添加附加职责
动态的给一个对象添加功能,这些功能可以动态的被撤销
需要为一批平行的兄弟类进行改造或者加装功能

案例:为咖啡添加作料

咖啡接口

package Decorator;

/**
 * 抽象咖啡类
 */
public interface Coffee {
   

    double getCost();

    String getDescription();
}

装饰器抽象类

package Decorator;

/**
 * 装饰器抽象类
 */
public abstract class CoffeeDecorator implements Coffee {
   

    //静态代理
    /**
     * 静态代理:
     * 创建目标  创建代理对象  将目标传给代理对象
     */
    protected final Coffee decoratorCoffee;

    public CoffeeDecorator(Coffee decoratorCoffee) {
   
        this.decoratorCoffee = decoratorCoffee;
    }

    @Override
    public double getCost() {
   
        return decoratorCoffee.getCost();
    }

    @Override
    public String getDescription() {
   
        return decoratorCoffee.getDescription();
    }
}

普通咖啡类:

package Decorator;

/**
 * 基础咖啡类
 */
public class SimpleCoffee implements Coffee{
   
    @Override
    public double getCost() {
   
        return 1.0;
    }

    @Override
    public String getDescription() {
   
        return "Simple coffee";
    }
}

牛奶装饰器类

package Decorator;

/**
 * 牛奶装饰器
 */
public class MilkDecorator extends CoffeeDecorator {
   

    public MilkDecorator(Coffee decoratorCoffee) {
   
        super(decoratorCoffee);
    }

    @Override
    public double getCost() {
   
        return super.getCost() + 0.5;
    }

    @Override
    public String getDescription() {
   
        return super.getDescription() + "with milk";
    }

}

糖浆装饰器类

package Decorator;

/**
 * 糖浆装饰器
 */
public class SyrupDecorator extends CoffeeDecorator{
   

    public SyrupDecorator(Coffee decoratorCoffee) {
   
        super(decoratorCoffee);
    }

    @Override
    public double getCost() {
   
        return super.getCost() + 1;
    }

    @Override
    public String getDescription() {
   
        return super.getDescription() + "with 糖浆";
    }

}

测试类:

package Decorator;

public class Client {
   

    public static void main(String[] args) {
   

        //基本咖啡
        Coffee simpleCoffee = new SimpleCoffee();
        System.out.println("simpleCoffee" + simpleCoffee.getDescription() + ",cost:" + simpleCoffee.getCost());

        //咖啡 + 牛奶
        Coffee milkCoffee = new MilkDecorator(simpleCoffee);
        System.out.println("milkCoffee:" + milkCoffee.getDescription() + ",cost:" + milkCoffee.getCost());

        //咖啡 + 牛奶 + 糖
        Coffee syrupCoffee = new SyrupDecorator(milkCoffee);
        System.out.println("syrupCoffee + milkCoffee:" + syrupCoffee.getDescription() + ",cost:" + syrupCoffee.getCost());

    }

}

在这里插入图片描述
项目地址: https://gitee.com/htzGittee/design-patterns/tree/master/designPatterns

相关推荐

  1. 装饰模式

    2024-01-12 06:52:01       40 阅读
  2. 装饰设计模式

    2024-01-12 06:52:01       31 阅读
  3. 装饰模式(Decorator)

    2024-01-12 06:52:01       34 阅读
  4. 装饰模式

    2024-01-12 06:52:01       31 阅读
  5. 装饰模式

    2024-01-12 06:52:01       30 阅读
  6. 装饰模式

    2024-01-12 06:52:01       24 阅读
  7. 装饰模式

    2024-01-12 06:52:01       13 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-12 06:52:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-12 06:52:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-12 06:52:01       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-12 06:52:01       20 阅读

热门阅读

  1. node.js笔记(2)

    2024-01-12 06:52:01       31 阅读
  2. 探索计算机网络:应用层的魅力

    2024-01-12 06:52:01       36 阅读
  3. 数据分析-Pandas如何统计数据概况

    2024-01-12 06:52:01       33 阅读
  4. 通俗易懂玩QT:正则表达式 QRegularExpression 学习

    2024-01-12 06:52:01       32 阅读
  5. 什么是DDOS攻击?于自动化程度有哪些分类?

    2024-01-12 06:52:01       31 阅读
  6. 爬虫案例—抓取小米商店应用

    2024-01-12 06:52:01       32 阅读
  7. OpenGL和OpenGL ES显示YUV图片的着色器差别(一)

    2024-01-12 06:52:01       27 阅读
  8. 将github文件导入gitee中

    2024-01-12 06:52:01       25 阅读
  9. 计算机视觉(手势识别)

    2024-01-12 06:52:01       29 阅读
  10. 编程笔记 html5&css&js 035 HTML 地理定位

    2024-01-12 06:52:01       28 阅读
  11. HarmonyOS 工程目录介绍

    2024-01-12 06:52:01       32 阅读
  12. 目标检测正负样本分配策略----ATSS

    2024-01-12 06:52:01       34 阅读
  13. 图论中的树

    2024-01-12 06:52:01       28 阅读