设计模式再探——装饰模式

目录

  • 一、背景介绍
  • 二、思路&方案
  • 三、过程
    • 1.装饰模式简介
    • 2.装饰模式的类图
    • 3.装饰模式代码
    • 4.装饰模式,职责父类拆分的奥义
    • 5.装饰模式,部件抽象类的无中生有
  • 四、总结
  • 五、升华

一、背景介绍

最近公司在做架构模型的时候,涉及到装饰模式的研究,对于装饰模式的边界理解,本次有了看山还是山的效果,故做此总结以记录本次的升华。

二、思路&方案

  • 1.装饰模式简介
  • 2.装饰模式的类图
  • 3.装饰模式代码
  • 4.装饰模式,职责父类拆分的奥义
  • 5.装饰模式,部件抽象类的无中生有

三、过程

1.装饰模式简介

装饰模式(Decorator):动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。

解释:给(ConcreteComponent)对象增加一些额外(Decorator的子类)职责;就给(ConcreteComponent)增加功能来说;通过生成(ConcreteComponent)子类的方式增加功能;装饰模式更为灵活(扩展装饰子类通过聚合方式装饰,耦合性更低)

2.装饰模式的类图

在这里插入图片描述

3.装饰模式代码

package com.a7DesignPattern.a2StructuralType.a04Decorator;

/**
 * 功能描述:
 *
 * @Author:makang
 * @Date: 2021/5/19 14:43
 */
public class Client {
    public static void main(String[] args) {
        ConcreteComponent c = new ConcreteComponent();
        ConcreteComponentA a = new ConcreteComponentA();
        ConcreteComponentB b = new ConcreteComponentB();

        a.setComponent(c);
        b.setComponent(a);
        b.Operation();
    }
}

package com.a7DesignPattern.a2StructuralType.a04Decorator;

/**
 * 功能描述:
 *
 * @Author:makang
 * @Date: 2021/5/19 11:30
 */
public abstract class Component {
    public abstract void Operation();
}

package com.a7DesignPattern.a2StructuralType.a04Decorator;

/**
 * 功能描述:
 *
 * @Author:makang
 * @Date: 2021/5/19 11:37
 */
public class ConcreteComponent extends Component{
    @Override
    public void Operation() {
        System.out.println("具体对象的操作");
    }
}

package com.a7DesignPattern.a2StructuralType.a04Decorator;


/**
 * 功能描述:
 *
 * @Author:makang
 * @Date: 2021/5/19 11:43
 */
public class Decorator extends Component{
    protected Component component;

    @Override
    public void Operation() {
        if(component != null){
            component.Operation();
        }
    }

    public void setComponent(Component component) {
        this.component = component;
    }
}

package com.a7DesignPattern.a2StructuralType.a04Decorator;

/**
 * 功能描述:
 *
 * @Author:makang
 * @Date: 2021/5/19 14:27
 */
public class ConcreteComponentA extends Decorator{
    private String addedState;

    @Override
    public void Operation() {
        super.Operation();
        addedState = "New State";
        System.out.println("具体装饰对象A");
    }
}

package com.a7DesignPattern.a2StructuralType.a04Decorator;

import com.a6UMLRelationShip.a3combination.a2.A;

/**
 * 功能描述:
 *
 * @Author:makang
 * @Date: 2021/5/19 14:29
 */
public class ConcreteComponentB extends Decorator{

    @Override
    public void Operation() {
        super.Operation();
        AddedBehavior();
        System.out.println("具体装饰对象B");
    }

    private void AddedBehavior(){

    }
}

4.装饰模式,职责父类拆分的奥义

Decorator类是从ConcreteComponent中的装饰行为中抽象出来的类;从而使得后续扩展装饰符合开闭原则。

5.装饰模式,部件抽象类的无中生有

ConcreteComponent中的装饰行为的拆分,使得这些行为与被装饰者必须得从客户端产生关系;这也就对客户端暴露了业务;因而产生Component类。

四、总结

  • 1.无装饰模式情况下,将装饰方式当做被装饰者类中行为;这些行为对于被装饰者类而言不支持开闭原则。
  • 2.装饰行为在被装饰者中剥离之后,使得两个如何合并成为了眼前的问题。
  • 3.无中生有的做一个部件抽象类,又将两者做了部件类上的合并。
  • 4.技术上可以实现,业务上没有实现;这样的一种实现结果是否算是符合要求的? 将这条透明化的问题提出来也是进步的印证。

五、升华

该模式从技术角度通过剥离+无中生有父类的角度实现了扩展装饰符合开闭原则,并且对于客户端也没有对外暴露装饰过程的效果;在业务的角度是需要站到技术的基础之上去理解业务才会更加顺畅。

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

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

相关文章

ChatGLM3:打造更智能、更安全的代码解释器和工具使用体验

ChatGLM3 是由智谱AI训练的第三代大型语言模型,它不仅能理解和生成人类语言,还能执行代码、调用工具,并以 markdown 格式进行响应。为了提高用户体验,同时避免用户输入的注入攻击,ChatGLM3 采用了全新的对话格式。下载…

Qt::UniqueConnection和lambda一块用无效

如果槽函数是lambda。 那么用了Qt::UniqueConnection也会出现槽函数被多次调用的问题。 原因: 参考官方文档: QObject Class | Qt Core 5.15.16https://doc.qt.io/qt-5/qobject.html#connect

小航助学2023年9月电子学会Scratch二级真题(含题库答题软件账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统(含题库答题软件账号) 单选题2.00分 删除编辑附件图文 答案:D 第1题点击绿旗,运行程序后,舞台上的图形是?( ) A、画笔粗细…

【JMeter】使用nmon进行性能资源监控

一、前言 ​ 在工作中可能会遇到需要在压测的时候对Linux服务器进行性能资源监控的情况。这时可以用nmon来对服务器进行监控。 二、nmon的下载安装 1.查看系统信息 shell cat /etc/os-release结果为 shell PRETTY_NAME"Debian GNU/Linux 12 (bookworm)" NAME&qu…

Linux shell编程学习笔记35:seq

0 前言 在使用 for 循环语句时,我们经常使用到序列。比如: for i in 1 2 3 4 5 6 7 8 9 10; do echo "$i * 2 $(expr $i \* 2)"; done 其中的 1 2 3 4 5 6 7 8 9 10;就是一个整数序列 。 为了方便我们使用数字序列,Linux提供了…

AdobeXD 是什么?你想知道的都在这里!

AdobeXD 是一个功能强大的原型创建工具。使用这个工具,你可以更快地开发你的设计。让你的项目有条不紊,消除拖延工作流程的重复任务和单调任务。快速与开发团队分享详细的设计规范。使用 AdobeXD 能够把创意迅速转化为原型,创建、构建、共享原…

vivado约束方法2

排序约束条件 因为XDC约束是按顺序应用的,并且是基于明确的优先级排列的规则,您必须仔细检查约束的顺序。 Vivado IDE为您的设计提供了全面的可视性。要逐步验证约束,请执行以下操作: 1.运行相应的报告命令。 2.查看Tcl控制台…

I/O设备模型

I/O设备模型 绝大部分的嵌入式系统都包括一些I/O(Input/Outut,输入/输出)设备,例如仪器上的数据显示屏、工业设备上的串口通信、数据采集设备上用于保存数据的Flash或SD卡,以及网络设备的以太网接口等。 I/O设备模型…

计网Lesson10 - 网络层之IP协议分析

文章目录 网络层协议IPv4 数据报格式IPv4 数据报首部格式版本(Version)首部长度(Header Length)区分服务(Differentiated Services Field)可选字段填充总长度(Total Length)标识、标…

算法Day32 买卖椰子水

买卖椰子水 Description 在海滩上,一杯椰子水的售价为5元。一名顾客一次购买一杯椰子水(按照bills支付的顺序)。 每位顾客购买椰子水时,可能向你支付 5 元、10 元或 20 元。你必须给每个顾客正确找零,对于支付 5 元的…

CentOS7 OpenSSL升级到OpenSSH9.5p1

原文链接: CentOS7 OpenSSL升级1.1.1w;OpenSSH 升级 9.5p1 保姆级教程 openssl从3.1.0升级到3.1.1遇到的问题 注意操作时需要联网请参考如下链接 内网服务器联网安装依赖参见我的另一篇文章 一、 前言 OpenSSH 的加密功能需要用到OpenSSL,所…

在服务器上配置jupyter notebook便于本地访问

文章目录 需求配置1. 安装jupyter2. 生成配置文件3. 设置登录密码并生成秘钥a. 打开服务器的终端b. 设置密码 4. 修改配置文件a. 进入配置文件所在的文件夹b. 编辑配置文件jupyter_notebook_config.pyc. 保存文件 5. 在服务器上生成jupyter访问地址 关注公众号:『 …

别整那么复杂,一二三就行了!Windows下vscode运行c++代码

这里写自定义目录标题 别整那么复杂,三步就行!Windows下vscode运行c代码下载VScode:https://code.visualstudio.com/Download#安装四个插件下载mingw-64:https://sourceforge.net/projects/mingw-w64/files/mingw-w64/大功告成&am…

ubuntu 自动安装 MKL Intel fortran 编译器 ifort 及完美平替

首先据不完全观察,gfortran 与 openblas是 intel fortran 编译器 ifotr和mkl的非常优秀的平替,openblas连函数名都跟mkl一样,加了一个下划线。 1, 概况 https://www.intel.com/content/www/us/en/developer/tools/oneapi/base-too…

螺旋矩阵算法(leetcode第885题)

题目描述: 在 rows x cols 的网格上,你从单元格 (rStart, cStart) 面朝东面开始。网格的西北角位于第一行第一列,网格的东南角位于最后一行最后一列。你需要以顺时针按螺旋状行走,访问此网格中的每个位置。每当移动到网格的边界之…

Fractal-Streets

title: Fractal Streets date: 2023-12-13 14:48:45 tags: 分形 categories: 算法进阶指南 题目大意 将原来的城市复制一遍放在原城市的上方,将原城市顺时针90放在原城市的左上方,将逆时针90后的城市放在原城市的左边,然后用道路将四部分链接…

python和pygame实现烟花特效

python和pygame实现烟花特效 新年来临之际,来一个欢庆新年烟花祝贺,需要安装使用第三方库pygame,关于Python中pygame游戏模块的安装使用可见 https://blog.csdn.net/cnds123/article/details/119514520 效果图及源码 先看效果图&#xff1a…

spingboot项目实战之若依框架创建新模块

前言 目前的脚手架系统很多,比较早接触诺依框架,以若依框架为参考如何创建新模块 步骤 1. 下载诺依框架,依照参考说明一步步,能做到系统运行起来。 2. 准备好mysql文件,创建新数据库表 3. 数据库管理工具navicat…

基于VGG-16+Android+Python的智能车辆驾驶行为分析—深度学习算法应用(含全部工程源码)+数据集+模型(四)

目录 前言总体设计系统整体结构图系统流程图 运行环境模块实现1. 数据预处理2. 模型构建3. 模型训练及保存4. 模型生成 系统测试1. 训练准确率2. 测试效果3. 模型应用 相关其它博客工程源代码下载其它资料下载 前言 本项目采用VGG-16网络模型,使用Kaggle开源数据集…

Docker | Docker+Nginx部署前端项目

= ✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏:Docker系列 ✨特色专栏: MySQL学习 🥭本文内容:Docker | Docker+Nginx部署前端项目 📚个人知识库: [Leo知识库]https://gaoziman.gi…