设计模式(十二)之装饰器模式

news2024/11/20 13:18:21

文章目录

  • 什么是装饰器模式
  • 例子:
  • 总结

什么是装饰器模式

现在有一块蛋糕,涂上奶油就变成了奶油蛋糕,如果加上草莓就是草莓奶油蛋糕,再加上蜡烛就变成了生日蛋糕。
程序中的对象与蛋糕十分相似。将对象类比成蛋糕,不断的加功能对对象进行修饰,它就变成了更加明确的对象。像这样不断地为对象添加装饰的设计模式被称为(Decorator)装饰器模式

例子:

将原本只显示数字的类扩展成显示加减运算并展示结果的类

顶层接口:数字展示
NumberDisplay

package StructuralPattern.DecoratorMode;

/**
 * 顶层数字显示接口
 */

public interface NumberDisplay {
    void setTxt(int num);

    String getTxt();
}

核心实现类:展示数字
NumberShow

package StructuralPattern.DecoratorMode;

/**
 * 数字显示实现类
 */

public class NumberShow implements NumberDisplay{
    private int num;

    @Override
    public void setTxt(int num) {
        this.num = num;
    }

    @Override
    public String getTxt() {
        return String.valueOf(num);
    }
}

扩展装饰器抽象类,专门用于扩展的抽象类
ArithmeticDecorator

package StructuralPattern.DecoratorMode;

/**
 * 运算装饰器
 */

public abstract class ArithmeticDecorator implements NumberDisplay {

    protected NumberDisplay target;

    public ArithmeticDecorator(NumberDisplay target) {
        this.target = target;
    }

    public void setTxt(int num) {
        this.target.setTxt(num);
    }
}

加号装饰器
PlusDecorate

package StructuralPattern.DecoratorMode;

/**
 * 加号装饰器
 */

public class PlusDecorate extends ArithmeticDecorator {

    private int num;

    public PlusDecorate(NumberDisplay target,int num){
        super(target);
        this.num = num;
    }

    @Override
    public String getTxt() {
        return target.getTxt() + " + " + num;
    }
}

减号装饰器
MinusDecorate

package StructuralPattern.DecoratorMode;

/**
 * 减号装饰
 */

public class MinusDecorate extends ArithmeticDecorator {

    private int num;

    public MinusDecorate(NumberDisplay target,int num) {
        super(target);
        this.num = num;
    }

    @Override
    public String getTxt() {
        return target.getTxt() + " - " + num;
    }
}

等号装饰器
EquelDecorate

package StructuralPattern.DecoratorMode;

/**
 * 等号装饰
 */

public class EquelDecorate extends ArithmeticDecorator {
    private int num;

    public EquelDecorate(NumberDisplay target, int num) {
        super(target);
        this.num = num;
    }


    @Override
    public String getTxt() {
        return target.getTxt() + " = " + num;
    }
}

Main

package StructuralPattern.DecoratorMode;

/**
 * Main
 */

public class Main {
    public static void main(String[] args) {
    	// 只展示核心功能
        NumberDisplay display1 = new NumberShow();
        display1.setTxt(1);
        System.out.println(display1.getTxt());
		
		// 展示扩展功能
        NumberDisplay display2 = new PlusDecorate(display1,1);
        NumberDisplay display3 = new MinusDecorate(display2,2);
        NumberDisplay display4 = new EquelDecorate(display3,0);
        System.out.println(display4.getTxt());

		// 展示扩展功能
        NumberDisplay display = new EquelDecorate(new MinusDecorate(new PlusDecorate(new NumberShow(),2),4),0);
        display.setTxt(2);
        System.out.println(display.getTxt());
    }
}

结果
在这里插入图片描述

总结

从上边例子可以看出核心类NumberShow数字显示,并未发生改变,尽管被扩展了多次功能,但是核心接口api依旧可以使用。Decorator模式主要目的是通过添加装饰物来增加对象的功能,如果需要增加核心功能就在顶层接口增加方法,并增加顶层接口实现类的功能;对于附加接口,则通过抽象装饰器类去扩展。

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

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

相关文章

Faster-RCNN代码解读6:主要文件解读-中

Faster-RCNN代码解读6:主要文件解读-中 前言 ​ 因为最近打算尝试一下Faster-RCNN的复现,不要多想,我还没有厉害到可以一个人复现所有代码。所以,是参考别人的代码,进行自己的解读。 ​ 代码来自于B站的UP主&#xff…

Qt音视频开发36-超时检测和自动重连的设计

一、前言 如果网络环境正常设备正常,视频监控系统一般都是按照正常运行下去,不会出现什么问题,但是实际情况会很不同,奇奇怪怪七七八八的问题都会出现,就比如网络出了问题都有很多情况(交换机故障、网线故…

TensorFlow 1.x 深度学习秘籍:11~14

原文:TensorFlow 1.x Deep Learning Cookbook 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自【ApacheCN 深度学习 译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。 不要担心自己的形象,只关心如…

持续集成——通过docker命令安装Jenkins

一、持续集成体系介绍 1、核心价值: 集成自动化测试,减少重复劳动 尽早发现和解决缺陷,减少风险 形成有机整体,明确阶段交付物 2、常见集成方案 a、阶段化 为不同的构建测试套件建立不同的CI循环周期 单元测试运行时间短,反馈…

测试基础篇

目录软件测试的生命周期测试用例设计如何描述一个bug如何创建一个Bug案例Bug的级别Bug的生命周期测试人员和开发人员产生争执了怎么办?软件测试的生命周期 软件测试的生命周期:需求分析→测试计划→测试设计、软件开发→测试执行→测试评估 软件测试&a…

AXI DMA

PG021 AXI DMA:AXI Direct Memory Access AXI DMA为内存和AXI4-Stream外设之间提供了高带宽的直接内存访问,其可选的S/G功能可以将CPU从数据搬运任务中解放出来。 AXI DMA通过AXI4-LITE接口对寄存器做一些配置和获取 MM2S:MemoryMap to St…

css 盒模型

CSS 中的盒子模型包括 IE 盒子模型和标准的 W3C 盒子模型。 box-sizing(有 3 个值哦):border-box,padding-box,content-box 这两种盒子模型最主要的区别就是 width 的包含范围: 在 标准的盒子模型中,width只是 content 部分(b…

嵌入式51单片机02-独立按键系列

文章目录独立按键一. 独立按键基础知识二. 独立按键系列代码1. 独立按键控制LED(按下灯亮,松开灯灭)(1)仿真电路图(2)源代码(3)实验结果2. 独立按键控制LED(按…

聚观早报|阿里云正式推出通义千问;京东零售开启5年最大组织变革

今日要闻:国家网信办规范生成式人工智能服务;阿里云正式推出通义千问;京东零售开启5年来最大组织变革;飞书将推出智能AI助手「My AI」;乐高将继续扩大在华零售布局国家网信办规范生成式人工智能服务 4 月 11 日&#x…

谈一谈Java的ThreadLocal

目录 先说原理: 再上代码: 运行结果: 先说原理: ThreadLocal 是一个本地线程副本变量工具类,它可以在每个线程中创建一个副本变量,每个线程可以独立地修改自己的副本变量,而不会影响其他线程…

【进阶C语言】自定义类型:结构体,枚举,联合

前言 作者简介:热爱跑步的恒川,正在学习C/C、Java、Python等。 本文收录于C语言进阶系列,本专栏主要内容为数据的存储、指针的进阶、字符串和内存函数的介绍、自定义类型结构、动态内存管理、文件操作等,持续更新! 相关…

ECM8.0——CCCM相关代码

ECM8.0——CCCM相关代码概览predIntraCCCMxCccmCalcModelsxCccmApplyModelxCccmCreateLumaRefxCccmGetLumaRefBufxCccmGetLumaPuBufxCccmCalcRefAverxCccmCalcRefArea概览 函数名称函数作用predIntraCCCM总体代码,根据CCCM技术预测输出xCccmCalcModels计算CCCM滤波器…

Idea+maven+spring-cloud项目搭建系列--14 整合请求参数校验

前言:当我们在进行web 项目的开发时,对于前端传入的参数,都需要进行一些非空必填等的验证,然后在进行业务逻辑的处理,如果写一堆的if 判断很不优雅,那么有没有好的方式来帮忙处理,本文通过hiber…

光电隔离转换器 直流信号放大器 导轨安装DIN11 IPO OC系列

概述: 导轨安装DIN11 IPO OC系列模拟信号隔离放大器是一种将输入信号隔离放大、转换成按比例输出的直流信号混合集成厚模电路。产品广泛应用在电力、远程监控、仪器仪表、医疗设备、工业自控等需要直流信号隔离测控的行业。此系列产品内部采用了线性光电隔离技术相…

DSP中定点与浮点运算

一、定点数及其定标 在定点DSP芯片中,采用的是定点数据数值运算,其操作数一般采用整形数来表示。一个整形数的最大表示范围由DSP芯片给定字长决定。字长越长,表示的范围越大,精度越高。 举例16位字长 每个16数位用1个符号位表示正…

九龙证券|这一刻,资本市场进入全新时代!

2023年4月10日,第一批10家主板注册制企业上市鸣锣敲钟,奏响了触及本钱商场灵魂深处革新的序曲。 动能切换中的我国对于高效资源配置的渴望,与革新进行时的本钱商场对于全面注册制的探究,一起凝集成一股连绵有力之暖流,…

学习安全攻防技能30讲-开篇|别说你没有被安全困扰过

文章目录学习安全攻防技能30讲-开篇|别说你没有被安全困扰过研读开篇安全重要吗?安全难学吗?学习安全攻防技能30讲-开篇|别说你没有被安全困扰过 研读开篇 文中说到一个竞赛叫CTF,这个之前从来没有听过的,作为开发人员涨知识了。…

Java封装

Java封装\huge{Java封装}Java封装 JavaJavaJava的三大特征之一。 作用 告知如何设计对象的属性和方法,将对象完全独立起来。 ❗❗封装原则 对象代表什么,就要封装对应的数据,并且提供对应数据的行为。(尤其是后半句非常重要&a…

012:Mapbox GL显示弹窗Popup

第012个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中显示弹窗。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共70行)相关API参考:专栏目标示例效果 配置方式 1)查看基础设置:https://xiaozhuan…

PHP医院安全(不良)事件管理系统源码,十多种不良事件类型,上百种报告内容数据表

医院不良事件上报系统源码,PHP医院安全(不良)事件管理系统源码 技术架构:前后端分离,仓储模式, 开发语言:PHP 开发工具:vscode 前端框架:vue2element 后端框架&…