《HeadFirst设计模式(第二版)》第三章代码——装饰者模式

代码文件结构:

 星巴兹案例:

CondimentDecorator
package Chapter3_DecorativeObjects.Decorators;

import Chapter3_DecorativeObjects.Beverage;

/**
 * @Author 竹心
 * @Date 2023/8/3
 **/

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

    public Size getSize(){
        return this.beverage.getSize();
    }
}
Mocha
package Chapter3_DecorativeObjects.Decorators;

import Chapter3_DecorativeObjects.Beverage;

/**
 * @Author 竹心
 * @Date 2023/8/3
 **/

public class Mocha extends CondimentDecorator{

    public Mocha(Beverage beverage){
        //在前一种饮料的基础上加上装饰
        //然后就可以通过 this.beverage.cost()来获取前者的花费,递归获取最终花费
        this.beverage = beverage;
    }

    @Override
    public String getDescription() {
        return this.beverage.getDescription()+", Mocha";//摩卡
    }

    @Override
    public double cost() {
        //递归获取最终花费
        double cost = this.beverage.cost();
        if(this.beverage.getSize() == Size.TALL){
            cost+=0.15;
        }else if(this.beverage.getSize() == Size.GRANDE){
            cost+=0.20;
        }else if(this.beverage.getSize() == Size.VENTI){
            cost+=0.25;
        }
        return cost;
    }
}
Soy
package Chapter3_DecorativeObjects.Decorators;

import Chapter3_DecorativeObjects.Beverage;

/**
 * @Author 竹心
 * @Date 2023/8/3
 **/

public class Soy extends CondimentDecorator{

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

    @Override
    public String getDescription() {
        return this.beverage.getDescription()+", Soy";//豆奶
    }

    @Override
    public double cost() {
        //递归获取最终花费
        double cost = this.beverage.cost();
        if(this.beverage.getSize() == Size.TALL){
            cost+=0.10;
        }else if(this.beverage.getSize() == Size.GRANDE){
            cost+=0.15;
        }else if(this.beverage.getSize() == Size.VENTI){
            cost+=0.20;
        }
        return cost;
    }
}
Whip
package Chapter3_DecorativeObjects.Decorators;

import Chapter3_DecorativeObjects.Beverage;

/**
 * @Author 竹心
 * @Date 2023/8/3
 **/

public class Whip extends  CondimentDecorator{

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

    @Override
    public String getDescription() {
        return this.beverage.getDescription()+", Whip";//奶泡
    }

    @Override
    public double cost() {
        //递归获取最终花费
        double cost = this.beverage.cost();
        if(this.beverage.getSize() == Size.TALL){
            cost+=0.08;
        }else if(this.beverage.getSize() == Size.GRANDE){
            cost+=0.10;
        }else if(this.beverage.getSize() == Size.VENTI){
            cost+=0.12;
        }
        return cost;
    }
}
Beverage
package Chapter3_DecorativeObjects;


/**
 * @Author 竹心
 * @Date 2023/8/3
 **/

public abstract class Beverage {
    String description = "Unknown Beverage";
    //加入小杯、中杯和大杯(tall, grande, venti)
    public enum Size{TALL, GRANDE, VENTI};

    Size size = Size.TALL;

    public Size getSize() {
        return size;
    }

    public void setSize(Size size) {
        this.size = size;
    }

    public String getDescription(){
        return this.description;
    }

    public abstract double cost();
}
Espresso
package Chapter3_DecorativeObjects;

/**
 * @Author 竹心
 * @Date 2023/8/3
 **/

public class Espresso extends Beverage{
    public Espresso(){
        this.description = "Espresso";//浓缩咖啡
    }

    @Override
    public double cost() {
        return 1.99;
    }
}
HouseBlends
package Chapter3_DecorativeObjects;

/**
 * @Author 竹心
 * @Date 2023/8/3
 **/

public class HouseBlends extends Beverage{
    public HouseBlends(){
        this.description = "House Blend Coffee";//家常综合咖啡
    }

    @Override
    public double cost() {
        return 0.89;
    }
}
StarbuzzCoffee
package Chapter3_DecorativeObjects;

import Chapter3_DecorativeObjects.Decorators.Mocha;
import Chapter3_DecorativeObjects.Decorators.Soy;
import Chapter3_DecorativeObjects.Decorators.Whip;

/**
 * @Author 竹心
 * @Date 2023/8/3
 **/

public class StarbuzzCoffee {
    public static void main(String[] args) {
        Beverage beverage = new Espresso();//浓缩咖啡
        System.out.println(beverage.getDescription()+" $"+beverage.cost());

        Beverage beverage1 = new HouseBlends();
        beverage1 = new Mocha(beverage1);//在家常综合咖啡里面加入摩卡
        beverage1 = new Whip(beverage1);//再加入奶泡
        beverage1 = new Soy(beverage1);//再加入豆奶
        beverage1 = new Mocha(beverage1);//双倍摩卡
        System.out.println(beverage1.getDescription()+" $"+beverage1.cost());

        Beverage beverage2 = new HouseBlends();
        beverage2.setSize(Beverage.Size.VENTI);//选择大杯
        beverage2 = new Mocha(beverage2);//在家常综合咖啡里面加入摩卡
        beverage2 = new Whip(beverage2);//再加入奶泡
        beverage2 = new Soy(beverage2);//再加入豆奶
        beverage2 = new Mocha(beverage2);//双倍摩卡
        System.out.println(beverage2.getDescription()+" $"+beverage2.cost());
    }
}

 运行结果:

 

myJavaIO案例

LowerCaseInputStream
package Chapter3_DecorativeObjects.MyJavaIO;

import java.io.FilterInputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * @Author 竹心
 * @Date 2023/8/3
 **/

public class LowerCaseInputStream extends FilterInputStream {

    public LowerCaseInputStream(InputStream in){
        super(in);//在任意一种输入组件的基础上加入我们自己的装饰
    }

    @Override
    public int read() throws IOException {
        //按字节为输入
        int c = in.read();
        //将每个字符转成小写
        //这里可以根据自己的需求更改
        return (c == -1 ? c : Character.toLowerCase((char)c));
    }

    @Override
    public int read(byte[] b, int off, int len) throws IOException {
        //按字节数组为输入
        int result = read(b, off, len);
        for(int i = off; i< off+result;i++){
            b[i] = (byte) Character.toLowerCase((char)b[i]);
        }
        return result;
    }
}
InputTest
package Chapter3_DecorativeObjects.MyJavaIO;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * @Author 竹心
 * @Date 2023/8/3
 **/

public class InputTest {
    public static void main(String[] args) {
        int c;
        try{
            InputStream in = new LowerCaseInputStream(
                    new BufferedInputStream(
                            new FileInputStream("D:\\JAVA\\Code\\DesignPatterns\\src\\Chapter3_DecorativeObjects\\MyJavaIO\\test.txt")));
            while((c = in.read()) >= 0){
                System.out.print((char)c);
            }
            in.close();
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

test.txt

Try My Best To Beat You!

运行结果:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/63182.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数智保险 创新未来 | GBASE南大通用亮相中国保险科技应用高峰论坛

本届峰会以“数智保险 创新未来”为主题&#xff0c;GBASE南大通用携新一代创新数据库产品及金融信创解决方案精彩亮相&#xff0c;与国内八百多位保险公司高管和众多保险科技公司技术专家&#xff0c;就保险领域数字化的创新应用及生态建设、新一代技术突破及发展机遇、前沿科…

空地协同智能消防系统——无人机、小车协同

1 题目 1.1 任务 设计一个由四旋翼无人机及消防车构成的空地协同智能消防系统。无人机上安装垂直向下的激光笔&#xff0c;用于指示巡逻航迹。巡防区域为40dm48dm。无人机巡逻时可覆盖地面8dm宽度区域。以缩短完成全覆盖巡逻时间为原则&#xff0c;无人机按照规划航线巡逻。发…

Ubuntu安装JDK与IntelliJ IDEA

目录 前言 Ubuntu 安装 JDK 1、更新软件包列表 2、安装OpenJDK 3、验证安装 Ubuntu安装IntelliJ IDEA 1、下载 IntelliJ IDEA 2、解压缩 IntelliJ IDEA 安装包 3、移动 IntelliJ IDEA 到安装目录 4、启动 IntelliJ IDEA 前言 APT&#xff08;Advanced Package Tool&…

-bash: ./startup.sh: Permission denied解决

今天在Linux上启动Tomcat&#xff0c;结果弹出&#xff1a;-bash: ./startup.sh: Permission denied 的提示。 这是因为用户没有权限&#xff0c;而导致无法执行。用命令chmod 修改一下bin目录下的.sh权限就可以了。 在Tomcat的bin目录下 &#xff0c;输入命令行 &#xff1a;c…

MyBatis关联查询

文章目录 前言多对一关联 association一对多关联 collectionresultMap元素 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 关联查询是指在一个查询中同时获取多个表中的数据&#xff0c;将它们结合在一起进行展示。 关联表需要两个及以上的表 数据库代…

升级你的GitHub终端认证方式:从密码到令牌

升级你的GitHub终端认证方式&#xff1a;从密码到令牌 前言 GitHub官方在2021年8月14日进行了一次重大改变&#xff0c;它将终端推送代码时所需的身份认证方式从密码验证升级为使用个人访问令牌&#xff08;Personal Access Token&#xff09;。这个改变引起了一些新的挑战&am…

java网络编程概述及例题

网络编程概述 计算机网络 把分布在不同地理区域的计算机与专门的外部设备用通信线路连成一个规模大、功能强的网络系统&#xff0c;从而使众多的计算机可以方便地互相传递信息、共享硬件、软件、数据信息等资源。 网络编程的目的 直接或间接地通过网络协议与其他计算机实现…

【NLP概念源和流】 04-过度到RNN(第 4/20 部分)

接上文 【NLP概念源和流】 03-基于计数的嵌入,GloVe(第 3/20 部分) 一、说明 词嵌入使许多NLP任务有了显著的改进。它对单词原理图的理解以及将不同长度的文本表示为固定向量的能力使其在许多复杂的NLP任务中非常受欢迎。大多数机器学习算法可以直接应用于分类和回归任务的…

独立站私域怎么玩?浅浅了解一下吧!

当你是一个跨境电商独立站的卖家&#xff0c;你的工作有三个主要焦点&#xff1a;充分利用流量、提升用户转化率和降低用户的总体成本。 然而&#xff0c;除了利用广告以外&#xff0c;是否有更多的策略可以帮助你接触到用户&#xff0c;同时降低吸引新用户的成本呢&#xff1…

SpringBoot统一功能处理(AOP思想实现)(统一用户登录权限验证 / 异常处理 / 数据格式返回)

主要是三个处理&#xff1a; 1、统一用户登录权限验证&#xff1b; 2、统一异常处理&#xff1b; 3、统一数据格式返回。 目录 一、用户登录权限校验 &#x1f345; 1、使用拦截器 &#x1f388; 1.1自定义拦截器 &#x1f388; 1.2 设置自定义拦截器 &#x1f388;创建cont…

SSM项目-博客系统

在线体验项目&#xff1a;登陆页面 项目连接&#xff1a;huhublog_ssm: 个人博客系统 技术栈&#xff1a;SpringBoot、SpringMVC、Mybatis、Redis、JQuery、Ajax、Json (gitee.com) 1.项目技术点分析 SpringBoot、SpringWeb(SpringMVC)、MyBatis、MySQL(8.x)、Redis(存储验…

JSP实训项目设计报告—MVC简易购物商城

JSP实训项目设计报告—MVC简易购物商城 文章目录 JSP实训项目设计报告—MVC简易购物商城设计目的设计要求设计思路系统要求单点登录模块商品展示模块购物车展示模块 概要设计Model层View层Controller层 详细设计Model层View层登录界面系统主界面 Controller层 系统运行效果项目…

【驱动开发day8作业】

作业1&#xff1a; 应用层代码 #include <stdlib.h> #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <string.h> #include <sys/ioctl.h>int main(int…

CVE-2022-23134(Zabbix setup 访问控制登录绕过)

目录 一、题目 二、进入题目 一、题目 靶标介绍&#xff1a; Zabbix Sia Zabbix是拉脱维亚Zabbix SIA&#xff08;Zabbix Sia&#xff09;公司的一套开源的监控系统。该系统支持网络监控、服务器监控、云监控和应用监控等。 Zabbix 存在安全漏洞&#xff0c;该漏洞源于在初始…

为什么要选择文件传输软件?有哪些最佳高速文件传输软件?

是否经历过这样的场景&#xff0c;正在努力地完成工作任务&#xff0c;但是由于制作的数据无法及时传送给合作伙伴&#xff0c;工作流程被打断了&#xff1f;这听起来很令人沮丧&#xff0c;对吧&#xff1f;可是&#xff0c;这种情况在现实中并不罕见。 因此&#xff0c;需要…

数据结构——搜索二叉树

文章目录 一. 概念二. 二叉搜索树的操作1.查找2.插入3.删除&#xff08;重点&#xff09;4.遍历5.拷贝构造与析构 三.二叉搜索树的递归实现1.递归查找2.递归插入3.递归删除 四.二叉搜索树的性能分析五.二叉树搜索的应用六.源码 前言&#xff1a; 本章我们将认识一种新的二叉树—…

Spring Boot配置文件与日志文件

1. Spring Boot 配置文件 我们知道, 当我们创建一个Spring Boot项目之后, 就已经有了配置文件存在于目录结构中. 1. 配置文件作用 整个项目中所有重要的数据都是在配置文件中配置的&#xff0c;比如: 数据库的连接信息 (包含用户名和密码的设置) ;项目的启动端口;第三方系统的调…

【chrome扩展开发】vue-i18n使用问题及解决方案

记录chrome扩展开发时调用vue-i18n的一些问题和解决方法 环境 vue: ^3.3.4vue-i18n: ^9.2.2vite: ^4.4.8 错误1 Uncaught (in promise) EvalError: Refused to evaluate a string as JavaScript because unsafe-eval is not an allowed source of script in the following Con…

vi 编辑器入门到高级

vi 编辑器的初级用法vi 编辑器的工作模式1. 命令模式2. 文本输入模式3. 状态行vi 工作模式切换存储缓冲区 vi 编辑器命令1. 启动 vi2. 文本输入3. 退出 vi4. 命令模式下的 光标移动5. 命令模式下的 文本修改6. 从 命令模式 进入 文本输入模式7. 搜索字符串8. vi 在线帮助文档 v…

云原生Kubernetes:阿里云托管k8s集群ACK创建和使用

目录 一、理论 1.容器服务Kubernetes版 2.ACK Pro版集群概述 3.CKA版本说明 二、实验 1.创建专有版Kubernetes集群 三、问题 1.依赖检查未通过 一、理论 1.容器服务Kubernetes版 &#xff08;1&#xff09;概念 阿里云容器服务Kubernetes版&#xff08;Alibaba Cloud…
最新文章