首页 > 其他分享 >装饰者模式

装饰者模式

时间:2024-09-17 15:02:07浏览次数:1  
标签:cost Beverage getDescription 模式 public beverage 装饰

装饰者模式

装饰者模式(Decorator Pattern)是一种结构型设计模式,主要用于动态地给对象添加额外的功能,而不改变其结构。这个模式通过创建一个装饰类来包装原始对象,从而扩展其功能。

主要角色

  1. 组件(Component):定义一个接口或抽象类,声明可以被装饰的对象所共有的接口。
  2. 具体组件(ConcreteComponent):实现了组件接口的具体类,代表需要装饰的对象。
  3. 装饰者(Decorator):持有一个组件对象的引用,并实现组件接口。装饰者可以在调用原始组件的方法之前或之后,添加额外的功能。
  4. 具体装饰者(ConcreteDecorator):继承自装饰者,具体实现要添加的功能。

结构示例

假设你有一个简单的 Coffee 类,想要动态地给它添加不同的配料,比如牛奶或糖。你可以通过装饰者模式来实现。

  1. 组件接口 Beverage

    public interface Beverage {
        String getDescription();
        double cost();
    }
    
  2. 具体组件 Coffee

    public class Coffee implements Beverage {
        @Override
        public String getDescription() {
            return "Coffee";
        }
    
        @Override
        public double cost() {
            return 2.00;
        }
    }
    
  3. 装饰者基类 BeverageDecorator

    public abstract class BeverageDecorator implements Beverage {
        protected Beverage beverage;
    
        public BeverageDecorator(Beverage beverage) {
            this.beverage = beverage;
        }
    
        @Override
        public abstract String getDescription();
    }
    
  4. 具体装饰者 MilkDecorator

    public class MilkDecorator extends BeverageDecorator {
        public MilkDecorator(Beverage beverage) {
            super(beverage);
        }
    
        @Override
        public String getDescription() {
            return beverage.getDescription() + ", Milk";
        }
    
        @Override
        public double cost() {
            return beverage.cost() + 0.50; // 假设牛奶的费用是 $0.50
        }
    }
    
  5. 具体装饰者 SugarDecorator

    public class SugarDecorator extends BeverageDecorator {
        public SugarDecorator(Beverage beverage) {
            super(beverage);
        }
    
        @Override
        public String getDescription() {
            return beverage.getDescription() + ", Sugar";
        }
    
        @Override
        public double cost() {
            return beverage.cost() + 0.25; // 假设糖的费用是 $0.25
        }
    }
    
  6. 测试类 TestDecoratorPattern

    public class TestDecoratorPattern {
        public static void main(String[] args) {
            // 创建一个基础的咖啡对象
            Beverage coffee = new Coffee();
            System.out.println("Description: " + coffee.getDescription()); // Output: Coffee
            System.out.println("Cost: $" + coffee.cost()); // Output: 2.00
    
            // 添加牛奶装饰
            Beverage milkCoffee = new MilkDecorator(coffee);
            System.out.println("Description: " + milkCoffee.getDescription()); // Output: Coffee, Milk
            System.out.println("Cost: $" + milkCoffee.cost()); // Output: 2.50
    
            // 添加糖装饰
            Beverage milkSugarCoffee = new SugarDecorator(milkCoffee);
            System.out.println("Description: " + milkSugarCoffee.getDescription()); // Output: Coffee, Milk, Sugar
            System.out.println("Cost: $" + milkSugarCoffee.cost()); // Output: 2.75
        }
    }
    

解释

  • 组件接口 Beverage 定义了所有饮料的基本接口,包括获取描述和计算费用的方法。
  • 具体组件 Coffee 实现了 Beverage 接口,提供了基础的咖啡描述和费用。
  • 装饰者基类 BeverageDecorator 维护了一个 Beverage 对象的引用,并实现了 Beverage 接口,但 getDescription 方法是抽象的,具体装饰者需要实现它。
  • 具体装饰者 MilkDecoratorSugarDecorator 实现了 BeverageDecorator,分别添加了牛奶和糖的描述和费用。
  • 测试类 TestDecoratorPattern 演示了如何使用装饰者模式来动态地添加功能,并打印了结果。

通过装饰者模式,可以灵活地组合和扩展对象的功能,而不需要修改对象的原始代码。

标签:cost,Beverage,getDescription,模式,public,beverage,装饰
From: https://www.cnblogs.com/20lxj666/p/18388658

相关文章

  • 组合模式
    组合模式组合模式(CompositePattern)是一种结构型设计模式,用于将对象组合成树形结构以表示“部分-整体”的层次关系。它允许客户端以统一的方式处理单个对象和对象集合,使得客户端不需要区分具体的对象类型,从而简化了代码的处理逻辑。主要组成部分Component(组件):定义了叶子对象和......
  • 桥接模式
    桥接模式桥接模式(BridgePattern)是一种结构型设计模式,它通过将抽象部分与实现部分分离,从而使它们可以独立地变化。这个模式的主要目的是解耦抽象和实现,使得它们可以独立地变化和扩展。主要概念抽象(Abstraction):这是一个接口或抽象类,它定义了高层次的操作。修正抽象(RefinedA......
  • 【加密算法基础——AES CBC模式代码解密实践】
    AES解密实践之代码实现AES解密使用python脚本比较灵活,但是一定要保证脚本是调试过的,才能在找到正确的密文,密钥,初始向量的情况下,解出正确的明文。但是对于AES解密,命令行无法处理key截断的问题。实际测试了一下,CBC模式,对于key截断的问题可以解决,但是CFB模式,目前还无法实验......
  • 设计模式---- 门面模式
    门面模式门面模式(FacadePattern)是一种结构型设计模式,用于为复杂子系统提供一个统一、简单的接口,隐藏系统的复杂性。通过门面模式,客户端无需直接与系统的内部组件交互,而是通过门面类与系统打交道,简化了客户端的使用,降低了系统的复杂性和耦合度。门面模式的主要概念定义:门面模......
  • 攻防世界 ————新手模式适合作为桌面 misc
    (本篇文章参考大佬的解题)下载附件,得到rar的的压缩包,解压缩,打开文件后有一张图片:打开图片发现什么也没有:使用软件Stegsolve打开图片看有什么问题:点击下一页:点击后发现有一个二维码:把他保存下来,使用软件扫码看看里面有什么:(我是用微信扫码的)出现了十六进制的数字:把他复......
  • 设计模式---- 工厂模式
    工厂模式工厂模式是一种创建型设计模式,它的主要目的是将对象的创建过程与对象的使用过程分离。工厂模式通过引入工厂类或者工厂方法,隐藏对象创建的复杂性,使得代码更加灵活、可扩展。工厂模式的使用场景主要在于:当我们需要对创建的对象进行封装或延迟创建时,工厂模式是一个很好的选......
  • 反DDD模式之关系型数据库
    本文书接上回《图穷匕见-所有反DDD模式都是垃圾》,关注公众号(老肖想当外语大佬)获取信息:最新文章更新;DDD框架源码(.NET、Java双平台);加群畅聊,建模分析、技术实现交流;视频和直播在B站。背景我在与开发者交流关于DDD的建模思路时,往往会遇到一个难题,就是不少经验丰富的开发者,总是带着技......
  • 反DDD模式之关系型数据库
    本文书接上回《图穷匕见-所有反DDD模式都是垃圾》,关注公众号(老肖想当外语大佬)获取信息:最新文章更新;DDD框架源码(.NET、Java双平台);加群畅聊,建模分析、技术实现交流;视频和直播在B站。背景我在与开发者交流关于DDD的建模思路时,往往会遇到一个难题,就是不少经验丰富的开发者,总是带......
  • Qt:实现单例模式
    前言记录一下。正文单例模式根据实现方式和应用场景在Qt中可以分为以下几种类型:1.懒汉式单例懒汉式单例在第一次使用时才创建实例,延迟了对象的初始化。懒汉式单例分为线程安全和线程不安全两种实现方式。线程不安全的懒汉式单例:在第一次调用getInstance()时创建......
  • 【理论篇】数据挖掘 第六章 挖掘频繁模式、关联和相关性:基本概念和方法(下)
    说明:文章为《数据挖掘:概念与技术原书第03版》的学习笔记,该书是数据挖掘领域的经典之作,想了解更多内容请参阅原著。首先祝大家中秋快乐,本文章接上篇【理论篇】数据挖掘第六章挖掘频繁模式、关联和相关性:基本概念和方法(上)思考:满足最小支持度和最小置信度的模式一定是有趣......