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

news2024/11/20 3:18:43

代码文件结构:

 星巴兹案例:

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.coloradmin.cn/o/830558.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

opencv-34 图像平滑处理-双边滤波cv2.bilateralFilter()

双边滤波&#xff08;BilateralFiltering&#xff09;是一种图像处理滤波技术&#xff0c;用于平滑图像并同时保留边缘信息。与其他传统的线性滤波方法不同&#xff0c;双边滤波在考虑像素之间的空间距离之外&#xff0c;还考虑了像素之间的灰度值相似性。这使得双边滤波能够有…

Scratch 教程 -- 逐字化输出

首先我们来探讨一下对于一个逐字化模块(自定义积木)&#xff0c;有哪些需要设置的参数(请注意&#xff0c;在这里我会先提出一种常规且简便的写法&#xff0c;再进一步讲述其它的优化版本) 1.内容&#xff1a;对于一个文本&#xff0c;其内容是一定需要的(不然你还用啥逐字化啊…

新概念英语的网盘资源

新版新概念英语1-4册全部视频和课本_免费高速下载|百度网盘-分享无限制百度网盘为您提供文件的网络备份、同步和分享服务。空间大、速度快、安全稳固&#xff0c;支持教育网加速&#xff0c;支持手机端。注册使用百度网盘即可享受免费存储空间https://pan.baidu.com/s/18wyeA#l…

C++STL——deque容器详解

纵有疾风起&#xff0c;人生不言弃。本文篇幅较长&#xff0c;如有错误请不吝赐教&#xff0c;感谢支持。 &#x1f4ac;文章目录 一.deque容器的基本概念二.deque容器常用操作①deque构造函数②deque元素操作③deque赋值操作④deque交换操作⑤deque大小操作⑥deque插入和删除…

使用IPSEC VPN 在有防火墙的场景和有NAT转换的场景下实现隧道通信实验

目录 一、在有防火墙的场景 1、为所有设备配置对应ip地址&#xff1a; 2、进入两个防火墙实现公网互通 3、测试公网是否互通 4、进入SW1配置IPSEC VPN 5、进入SW2配置IPSEC VPN 6、配置策略方向ESP的流量 7、尝试使用PC1访问PC2 二、在有NAT地址转换的场景 1、为新增加…

C语言中的数据类型有哪些?

有符号数signed可以存储负数&#xff0c;无符号数呢只能存储非负数 我们要考虑两个问题。 第一个问题是要存储的这个整数&#xff0c;它是一个多大的范围&#xff0c;比如说要存储一个五。还有比如说我可能要算个数65535&#xff0c;或者说我要算出一个数65536&#xff0c;可能…

Cilium系列-11-启用带宽管理器

系列文章 Cilium 系列文章 前言 将 Kubernetes 的 CNI 从其他组件切换为 Cilium, 已经可以有效地提升网络的性能. 但是通过对 Cilium 不同模式的切换/功能的启用, 可以进一步提升 Cilium 的网络性能. 具体调优项包括不限于: 启用本地路由(Native Routing)完全替换 KubeProx…

P-DQN:离散-连续混合动作空间的独特算法

一、说明 本文首先说明DQN是个什么概念&#xff0c; DQN&#xff08;Deep Q-Network&#xff09;是一种基于深度学习的强化学习算法&#xff0c;在游戏AI中表现优异&#xff0c;如AlphaGo。然后说明人物动作预测的算法实现方法。 二、关于DQN的概念和实验 DQN&#xff08;Deep …

混合精度训练中的内存占用

结论&#xff1a; 在模型训练中&#xff0c;fp16会比fp32快很多&#xff0c;因此&#xff0c;一般会使用fp16的参数进行模型的前向和后向计算。然而&#xff0c;在进行梯度累加的时候&#xff0c;fp16往往会精度不够&#xff0c;无法满足计算需求。因此&#xff0c;会在反向计…

SOLIDWORKS等轴测剖切视图的创建技巧

在SOLIDWORKS工程图中&#xff0c;经常会用到等轴测剖切视图来显示零件或装配体的内部结构&#xff0c;下面介绍一下两种创建方式&#xff0c;供大家参考&#xff0c;以下图为例。 方法一 第一步&#xff0c;打开零件&#xff0c;创建一个切除拉伸的配置&#xff0c;该配置为 …

全网超细,Jenkins持续集成-自动化测试(详细整理)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 执行集成构建 持…

计算机top命令

top 快捷键 1 核心参数 1 1 参考资料 [1]. https://blog.csdn.net/weixin_45465395/article/details/115728520 [2].https://www.cnblogs.com/liushui-sky/p/13224762.html

为了规避风险,如何给大模型打水印?

大型语言模型&#xff0c;如最近开发的ChatGPT&#xff0c;可以撰写文件、创建可执行代码和回答问题&#xff0c;通常具有人类般的能力。 随着这些大模型的应用越来越普遍&#xff0c;越来越大的风险也显现了出来&#xff0c;它们可能被用于恶意目的。这些恶意目的包括&#xf…

uni-app选择器( uni-data-picker)选择任意级别

背景说明 uni-app 官方的插件市场有数据驱动选择器&#xff0c;可以用作多级分类的场景。引入插件后&#xff0c;发现做不到只选择年级&#xff0c;不选择班级&#xff08;似乎&#xff0c;只能到最后子节点了&#xff09;。 需求中&#xff0c;有可能选择的不是叶子。比如&a…

渣罐炉倾翻液压系统比例阀控制器

渣罐炉倾翻液压系统是一种用于渣罐炉倾翻的液压系统&#xff0c;由液压泵、油缸、阀组、油箱、管路等组成。 2. 启动液压泵&#xff0c;将液压油输送到油缸。 总之&#xff0c;渣罐炉倾翻液压系统具有操作简便、高效稳定等特点&#xff0c;适用于各种类型的渣罐炉倾翻。

SpringBoot+Vue开发笔记

参考&#xff1a;https://www.bilibili.com/video/BV1nV4y1s7ZN?p1 ----------------------------------------------------------概要总结---------------------------------------------------------- 1、MVC架构&#xff1a; View&#xff1a;与用户交互 Controller&…

浅谈下API初步认知

当我们谈论API&#xff0c;我们指的是应用程序接口&#xff08;Application Programming Interface&#xff09;。API允许不同的软件应用程序之间互相通信和交互。它定义了一组规定和协议&#xff0c;用于确定数据传输和请求的格式、方法和功能。 API的作用是在软件开发中提供一…

运动蓝牙耳机什么款式好、适合运动的蓝牙耳机推荐

夏天到了&#xff0c;越来越多的年轻人会选择在一天的忙碌之后通过简单的运动缓解疲劳。而在运动装备的选择上&#xff0c;除了常规的衣服、鞋之外&#xff0c;耳机也成为了当下年轻群体的必备项&#xff0c;尤其是在运动的过程中听听喜欢的音乐或者电台能够更好地放松身心。那…

Go init 顺序 使用建议

init函数的主要作用&#xff1a; 初始化不能采用初始化表达式初始化的变量。程序运行前的注册&#xff0c;例如初始化数据库链接。实现sync.Once功能。其他 init函数的主要特点&#xff1a; init函数先于main函数自动执行&#xff0c;不能被其他函数调用&#xff1b;init函数…

LeetCode每日一题Day3——1. 两数之和

✨博主&#xff1a;命运之光 &#x1f984;专栏&#xff1a;算法修炼之练气篇&#xff08;C\C版&#xff09; &#x1f353;专栏&#xff1a;算法修炼之筑基篇&#xff08;C\C版&#xff09; &#x1f433;专栏&#xff1a;算法修炼之练气篇&#xff08;Python版&#xff09; …