当前位置: 首页 > news >正文

设计模式之-装饰模式,快速掌握装饰模式,通俗易懂的讲解装饰模式以及它的使用场景

系列文章目录

设计模式之-6大设计原则简单易懂的理解以及它们的适用场景和代码示列
设计模式之-单列设计模式,5种单例设计模式使用场景以及它们的优缺点
设计模式之-3种常见的工厂模式简单工厂模式、工厂方法模式和抽象工厂模式,每一种模式的概念、使用场景和优缺点。
设计模式之模板方法模式,通俗易懂快速理解,以及模板方法模式的使用场景
设计模式之-建造者模式通俗易懂理解,以及建造者模式的使用场景和示列代码
设计模式之-代理模式,快速掌握理解代理模式,以及代理模式的使用场景
设计模式之-原型模式,快速掌握原型模式,通俗易懂的理解原型模式以及使用场景
设计模式之-中介者模式,快速掌握中介者模式,通俗易懂的讲解中介者模式以及它的使用场景
设计模式之-责任链模式,快速掌握责任链模式,通俗易懂的讲解责任链模式以及它的使用场景
设计模式之-装饰模式,快速掌握装饰模式,通俗易懂的讲解装饰模式以及它的使用场景
设计模式之-适配器模式,快速掌握适配器模式,通俗易懂的讲解适配器模式以及它的使用场景


文章目录

  • 系列文章目录
  • 一、快速理解装饰模式
  • 二、装饰模式使用场景
  • 代码示例


一、快速理解装饰模式

装饰模式是一种结构型设计模式,它允许动态地将新功能添加到对象上,同时又不改变其结构。装饰模式通过创建一个包装对象来包裹原始对象,然后在包装对象中添加新的行为或功能。

在现实生活中,装饰模式的例子可以是穿衣服。一个人(原始对象)可以穿不同的衣服(装饰对象)来增加新的功能或美化外观,但人的本质并没有改变。

二、装饰模式使用场景

  1. 当需要在不修改现有对象的情况下,动态地添加功能时,可以使用装饰模式。装饰模式允许通过包装对象来扩展原始对象的功能,而不是通过子类继承。
  2. 当需要为多个独立的对象添加相同或类似的功能时,可以使用装饰模式。装饰模式可以避免创建大量的子类来实现不同组合的功能。

代码示例

下面是一个通俗易懂的装饰模式示例代码,以咖啡和调料为场景:

// 抽象组件:咖啡
interface Coffee {
    double getCost();
    String getDescription();
}

// 具体组件:浓缩咖啡
class Espresso implements Coffee {
    @Override
    public double getCost() {
        return 1.0;
    }

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

// 抽象装饰器:调料
abstract class CoffeeDecorator implements Coffee {
    protected Coffee coffee;

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

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

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

// 具体装饰器:牛奶
class Milk extends CoffeeDecorator {
    public Milk(Coffee coffee) {
        super(coffee);
    }

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

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

// 具体装饰器:糖
class Sugar extends CoffeeDecorator {
    public Sugar(Coffee coffee) {
        super(coffee);
    }

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

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

// 客户端代码
public class Main {
    public static void main(String[] args) {
        Coffee espresso = new Espresso();
        Coffee milkCoffee = new Milk(espresso);
        Coffee sugarMilkCoffee = new Sugar(milkCoffee);

        System.out.println("Cost: " + sugarMilkCoffee.getCost());
        System.out.println("Description: " + sugarMilkCoffee.getDescription());
    }
}

在上面的示例中,Coffee是抽象组件,定义了咖啡的方法。Espresso是具体组件,实现了咖啡的方法。

CoffeeDecorator是抽象装饰器,实现了咖啡的方法,并包含一个咖啡对象的引用。Milk和Sugar是具体装饰器,分别继承了抽象装饰器,并在其中扩展了咖啡的功能。

在客户端代码中,首先创建了一个浓缩咖啡对象espresso,然后用Milk装饰了该咖啡对象,再用Sugar装饰了装饰后的咖啡对象。最后,通过调用装饰后的咖啡对象的方法,获取咖啡的费用和描述。

通过使用装饰模式,可以动态地添加功能或修改对象的行为,同时又不改变其结构。装饰模式可以避免使用子类继承的方式来实现不同组合的功能,使代码更加灵活和可扩展。

相关文章:

  • webpack 常见面试题
  • 使用 Taro 开发鸿蒙原生应用 —— 探秘适配鸿蒙 ArkTS 的工作原理
  • 计算机网络 网络安全技术
  • 解决java在idea运行正常,但是打成jar包后中文乱码问题
  • 51单片机基于时间片轮转的简单rtos
  • 【SpringBoot篇】解决缓存击穿问题① — 基于互斥锁方式
  • 开发语言:ArkTS
  • Redis基础篇-003 Redis数据结构及常用命令
  • Netty RPC 实现(二)
  • beaglebone black狗板,交叉编译Qt5(eglfs)
  • IntelliJ IDE 插件开发 | (三)消息通知与事件监听
  • UE5 Landscape 制作GIS卫星图地形
  • 在使用mapstruct,想忽略掉List<DTO>字段里面的,`data` 字段的映射, 如何写ignore: 使用@IterableMapping
  • 自定义Taro上传图片hooks(useUploadImg)
  • 让生活更智能,P1600边缘智能网关带你进入智能家居新时代
  • C#学习笔记 - C#基础知识 - C#从入门到放弃 - C# 结构、类与属性
  • 【起草】【第六章】ChatGPT 在软件测试的应用场景
  • 物联网主机E6000:引领智能安防新时代
  • display:grid
  • 【Java之数据结构与算法】
  • 巴基斯坦军方:印度导弹袭击巴首都附近空军基地
  • 金地集团:今年前4个月实现销售额109.3亿元,同比下降52.44%
  • 马新民卸任外交部条约法律司司长
  • 深入贯彻中央八项规定精神学习教育中央第六指导组指导督导中国工商银行见面会召开
  • 视频丨习近平主席专机抵达莫斯科,俄战机升空护航
  • 科技日报刊文批院士专家“赶场式”跑会:助长浮躁之气功利之心