首页 > 其他分享 >十四:装饰器模式:个性的华丽外衣

十四:装饰器模式:个性的华丽外衣

时间:2023-04-30 14:03:38浏览次数:31  
标签:coffee 外衣 模式 装饰 Beverage 华丽 个性 public Milk

a. 装饰器模式的精髓

装饰器模式是一种结构型设计模式,允许我们在不改变现有对象结构的情况下,动态地为对象添加新的功能。它提供了比继承更灵活的方式来扩展对象功能,遵循开闭原则。 装饰器模式的核心思想是:将一个对象嵌入另一个具有相同接口的对象(装饰器)中,然后通过装饰器调用原对象的方法,同时可以在调用前后添加额外的功能。通过嵌套多个装饰器,我们可以为原对象添加多个独立的功能。

b. 实战案例:装饰器模式实现

假设我们正在开发一个咖啡店订单系统,需要为咖啡添加各种调料,如牛奶、奶泡、巧克力等。我们可以使用装饰器模式来实现这个需求。 首先定义一个基类Beverage,表示饮料:

public abstract class Beverage {
    String description = "Unknown Beverage";

    public String getDescription() {
        return description;
    }

    public abstract double cost();
}

然后定义一个Coffee类,继承自Beverage:

public class Coffee extends Beverage {
    public Coffee() {
        description = "Coffee";
    }

    public double cost() {
        return 1.99;
    }
}

接下来,我们定义一个装饰器抽象类CondimentDecorator,也继承自Beverage:

public abstract class CondimentDecorator extends Beverage {
    public abstract String getDescription();
}

现在,我们可以为咖啡添加各种调料。例如,定义一个Milk装饰器:

public class Milk extends CondimentDecorator {
    Beverage beverage;

    public Milk(Beverage beverage) {
        this.beverage = beverage;
    }

    public String getDescription() {
        return beverage.getDescription() + ", Milk";
    }

    public double cost() {
        return beverage.cost() + 0.3;
    }
}

通过组合多个装饰器,我们可以为咖啡添加多种调料:

public class CoffeeShop {
    public static void main(String[] args) {
        Beverage coffee = new Coffee();
        coffee = new Milk(coffee);
        coffee = new Milk(coffee);

        System.out.println(coffee.getDescription() + " $" + coffee.cost());
    }
}

输出结果:Coffee, Milk, Milk $2.59

c. 装饰器模式优缺点探讨

优点:

1、提供了比继承更灵活的方式来扩展对象功能,遵循开闭原则。 2、可以通过嵌套多个装饰器为对象添加多个独立的功能,且不会导致类爆炸问题。 3、装饰器与被装饰对象之间的关系是松耦合的,易于维护和扩展。

缺点:

1、装饰器模式可能会导致大量细小的类,增加了系统的复杂度。 2、多层装饰器嵌套可能会导致代码可读性降低。

d. 装饰器模式在开源框架中的应用

在Java I/O库中,装饰器模式被广泛应用。java.io.InputStream、java.io.OutputStream、java.io.Reader 和 java.io.Writer 等抽象类都可以通过装饰器模式进行扩展。例如,BufferedReader和BufferedWriter就是为Reader和Writer添加缓冲功能的装饰器。 下面是一个简单的使用BufferedReader和BufferedWriter装饰器读取并写入文件的例子:

import java.io.*;

public class DecoratorExample {
    public static void main(String[] args) {
        try {
            // 创建一个文件输入流并装饰为BufferedReader
            BufferedReader reader = new BufferedReader(new FileReader("input.txt"));

            // 创建一个文件输出流并装饰为BufferedWriter
            BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"));

            // 读取输入文件并写入输出文件
            String line;
            while ((line = reader.readLine()) != null) {
                writer.write(line);
                writer.newLine();
            }

            // 关闭流
            reader.close();
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

这个例子展示了如何使用装饰器模式为文件 I/O 添加缓冲功能,提高读写性能。通过这种方式,我们可以在不修改原始类的基础上动态地为对象添加新功能,体现了装饰器模式的优雅之处。 总结起来,装饰器模式为我们提供了一种优雅的方式来动态扩展对象的功能。虽然它可能导致大量的小类和多层嵌套,但如果我们能够合理地组织代码,这种模式将极大地提高代码的可维护性和可扩展性。

标签:coffee,外衣,模式,装饰,Beverage,华丽,个性,public,Milk
From: https://blog.51cto.com/u_13616584/6237853

相关文章

  • 第四篇:白话tornado源码之褪去模板外衣的前戏
    原笔记博客链接:https://www.cnblogs.com/wupeiqi/p/4592637.html 执行字符串表示的函数,并为该函数提供全局变量本篇的内容从题目中就可以看出来,就是为之后剖析tornado模板做准备,也是由于该知识点使用的巧妙,所有就单独用一篇来介绍了。废话不多说,直接上代码:#!u......
  • ubuntu16.04个性化配置
    前言记录一下个人配置,方便后续参考正文配置用户sudo免密权限只建议在个人测试环境这么配置,否则最好root还是需要用密码确认一下sudosuecho"你的用户名ALL=(ALL:ALL)NOPASSWD:ALL">>/etc/sudoersroot用户下,指令自动补全sudosuaptupdateaptinstall......
  • 信创操作系统--麒麟Kylin桌面版 (项目三 控制中心-账户类设置与个性化设置)
     账户类设置1 账户设置在安装系统时会创建一个账户,如图1-1所示。图1-1添加用户账户(1)单击【开始】菜单用户头像,弹出用户账户界面,如图1-2所示。图1-2(2)单击【+添加新用户】按钮,即可添加新用户账户,如图1-3所示。图1-3(3)单击【确认】按钮后,弹出授权界面,如图1-4所示。在【密码】输入框中......
  • 谷歌云案例 | 零售商如何通过大规模的客户个性化来增加收入并减少客户流失
    *零售商越来越擅长让个人顾客感到被倾听和重视。这是必要的,因为66%的麦肯锡调查受访者表示,他们希望电子邮件营销信息能够满足他们的需求。虽然营销个性化专业知识不断增长,但管理起来仍然很困难,尤其是在规模上。OcadoRetail是世界上最大的专业在线杂货零售商之一,为英国超过645,......
  • 谷歌云案例 | 零售商如何通过大规模的客户个性化来增加收入
    零售商越来越擅长让个人顾客感到被倾听和重视。这是必要的,因为66% 的麦肯锡调查受访者表示,他们希望电子邮件营销信息能够满足他们的需求。虽然营销个性化专业知识不断增长,但管理起来仍然很困难,尤其是在规模上。OcadoRetail 是世界上最大的专业在线杂货零售商之一,为英国超过 6......
  • 手机号码归属地 API 实现个性化推荐的思路分析
    前言随着移动互联网和智能手机的普及,越来越多的人使用手机上网和购物,移动营销已成为企业获取用户和提升品牌知名度的重要手段。手机号码归属地API作为移动营销的关键工具,具有广阔的应用前景。本文将探讨如何利用手机号码归属地API进行个性化推荐和精准广告投放,希望对大家有......
  • 影谱:个性化在线视频制作工具
    很多人喜欢使用照片处理应用让普通的照片产生各种神奇的效果,甚至还做成Gif动画,但是如果能将照片添加到视频中,再配上一段精心组织的文字,是不是会更有趣呢?来自北京的影谱为......
  • 大家都在用的5款浏览器插件,助你打造高效、个性化的浏览世界
    当今互联网浏览器已经成为我们日常工作和生活不可或缺的一部分,然而,很多人可能只是使用浏览器自带的一些基本功能,而没有去尝试一些实用、个性化的浏览器插件。今天我将向大家......
  • Java高级开发必会的50个性能优化的细节
    在JAVA程序中,性能问题的大部分原因并不在于JAVA语言,而是程序本身。养成良好的编码习惯非常重要,能够显著地提升程序性能。●1.尽量在合适的场合使用单例如果想学习Java工程......
  • 换个新面孔:IHome主页插件为你打造个性化浏览体验!
    在数字化时代,浏览器已经成为了我们日常生活的必需品。然而,大多数的浏览器默认主页都是相同的、无趣的,可能只有一些常用网站的快捷方式和搜索引擎。这时候,你是否想要一款能够......