Java设计模式之装饰模式详解

Java设计模式之装饰模式详解

简介

装饰模式是一种结构型设计模式,它允许我们在不改变现有对象结构的情况下向其中添加新功能。

在装饰模式中,我们创建一个装饰器(Decorator)类,用于包装原有的类,并在原有基础上添加新的行为、状态或属性。这种方式实现了对原有类的扩展,同时也不影响原有类的行为。

设计原则

  • 开放-封闭原则(Open-Closed Principle):软件中的对象(类、模块、函数等)应该对扩展开放,但对修改封闭。
  • 单一职责原则(Single Responsibility Principle):一个类应该只有一个引起它变化的原因。

示例

示例1:实现一个饮料类

我们首先创建一个饮料类(Beverage)用于表示所有饮料的基类。该类只包含一个描述信息(description)与一个计算饮料价格的方法(cost)。

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

    public String getDescription() {
        return description;
    }

    public abstract double cost();
}

接下来,我们创建两个具体的饮料类:Espresso(浓缩咖啡)和HouseBlend(混合咖啡)。这两个类分别继承自饮料基类,实现了自己的饮料描述和价格计算方式。

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

    public double cost() {
        return 1.99;
    }
}

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

    public double cost() {
        return 0.89;
    }
}

现在我们已经实现了两个饮料类,并且可以计算出它们的价格。但是现在,我们需要为这些饮料添加一些调料,比如蒸奶、摩卡等。我们可以借助装饰模式完成这个功能。

示例2:实现饮料调料类

我们首先创建一个调料类(CondimentDecorator),作为装饰器类的基类。该类也继承自饮料基类,实现了自己的饮料描述和价格计算方式。

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

接下来,我们创建一些具体的调料类:Milk(牛奶)、Mocha(摩卡)和Soy(豆浆)。这些调料类同样继承自调料基类,实现了自己的调料描述和价格计算方式。

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 0.10 + beverage.cost();
    }
}

public class Mocha extends CondimentDecorator {
    Beverage beverage;

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

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

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

public class Soy extends CondimentDecorator {
    Beverage beverage;

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

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

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

这些调料类与饮料类非常类似,但它们包装了一个被装饰对象(即饮料对象),并重写了getDescription方法和cost方法。在这里,getDescription方法返回饮料对象的描述信息,加上调料对象的描述信息。cost方法返回饮料对象的价格,加上调料对象的价格。

示例3:组合饮料和调料

现在,我们可以组合多个饮料和调料,创建出不同的组合饮料。

Beverage beverage = new Espresso();
System.out.println(beverage.getDescription() + " $" + beverage.cost());

Beverage beverage2 = new HouseBlend();
beverage2 = new Soy(beverage2);
beverage2 = new Mocha(beverage2);
beverage2 = new Milk(beverage2);
System.out.println(beverage2.getDescription() + " $" + beverage2.cost());

在第一个例子中,我们创建了一杯浓缩咖啡,它没有任何调料,价格为1.99美元。

在第二个例子中,我们创建了一杯混合咖啡,加上了豆浆、摩卡和牛奶三种调料,价格为1.34美元。

总结

装饰模式是一种优秀的设计模式,在软件开发中有着广泛的应用,它可以帮助我们灵活地扩展类的功能,并且不影响原有类的行为。这个模式有一个清晰的结构,其中基础组件与装饰器组件之间耦合度非常低。我们只需为基础组件和装饰器组件定义相同的接口,并让它们都从同一个基类继承而来,就可以轻松地组合它们。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java设计模式之装饰模式详解 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • springmvc重定向实现方法解析

    下面是“springmvc重定向实现方法解析”的完整攻略。 背景知识 在Web应用中,重定向是将客户端请求重定向到其他URL的过程。它是一种常见的应用程序行为,使Web应用更具动态性和交互性。在Spring MVC应用程序中,重定向是在控制器方法中完成的。 Spring MVC重定向实现方法 方式一:利用@Controller和RedirectAttribu…

    Java 2023年5月16日
    00
  • 详解SpringBoot和SpringBatch 使用

    详解 Spring Boot 和 Spring Batch 使用 在本文中,我们将深入了解 Spring Boot 和 Spring Batch 的使用。我们将介绍 Spring Boot 和 Spring Batch 的概念、配置和使用,并提供两个示例。 Spring Boot Spring Boot 是一个用于创建独立的、生产级别的 Spring 应用程…

    Java 2023年5月15日
    00
  • Tomcat网站发布配置方案详细说明

    Tomcat网站发布配置方案详细说明 简介 Tomcat是一个开源的、轻量级的、需要Java环境的Web服务器,被广泛应用于Java Web开发领域。本文将介绍如何在Tomcat上发布网站并进行配置。 步骤 1. 下载安装Tomcat 将安装包下载到本地,解压到指定目录。例如解压到目录/opt/tomcat。 2. 配置Tomcat 2.1 修改Tomcat…

    Java 2023年6月15日
    00
  • java 非常好用的反射框架Reflections介绍

    Java 反射框架 Reflections 介绍 什么是 Reflections Reflections 是一个非常好用的 Java 反射框架,可以用于查找和获取 Java 类中的注解、方法、属性等信息。通过 Reflections 可以方便地实现自动化扫描和创建组件、注册 Bean 等功能。 Reflections 的使用方法 使用 Reflections…

    Java 2023年5月26日
    00
  • 使用Java实现简单的区块链程序的方法

    下面详细讲解使用Java实现简单的区块链程序的方法的完整攻略。 1. 确定区块链的数据结构 在Java中实现一个简单的区块链程序,需要首先确定区块链的数据结构。区块链数据结构一般由多个区块(Block)组成,每个区块都包含一个指向前一区块的“前哈希指针”,一个当前区块的哈希值,以及一些用于描述当前区块内容的信息,如时间戳,数据等。下面是一个区块的定义: pu…

    Java 2023年5月18日
    00
  • 基于Qt实现电子木鱼小游戏

    让我来为您详细讲解“基于Qt实现电子木鱼小游戏”的完整攻略。 1. 准备工作 首先,我们需要准备好Qt开发环境。可以前往Qt官网下载并安装最新版的Qt Creator。 2. 新建项目 打开Qt Creator,点击“新建项目”,选择“Qt Widgets应用”,并设置好项目名称和存储位置。在选择项目模板时,选择“Main Window”。 3. 设计UI界…

    Java 2023年5月23日
    00
  • Spring security 自定义过滤器实现Json参数传递并兼容表单参数(实例代码)

    这里给出详细的“Spring security 自定义过滤器实现Json参数传递并兼容表单参数(实例代码)”攻略: 1. 概述 当我们用 Spring Security 来进行用户认证和授权时,为了保证安全性,一般使用 POST 请求提交表单参数,而不能使用 GET 请求进行参数传递。但是在某些情况下,我们需要通过 Json 参数来进行传递,此时就需要用到自…

    Java 2023年5月20日
    00
  • SpringBoot注入自定义的配置文件的方法详解

    当我们开发一个SpringBoot应用时,我们通常需要使用一些配置文件来配置我们的应用程序,例如application.properties或application.yml文件。但是,有时我们需要注入我们自己的配置文件,例如redis.properties或mysql.properties等。那么,本文将介绍如何将自定义配置文件注入到SpringBoot应用…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部