装饰模式(单一责任)

Decorator(装饰模式:单一责任模式)

链接:装饰模式实例代码 + 解析

目的

  • 在某些情况下我们可能会“过度地使用继承来扩展对象的功能”,由于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性; 并且随着子类的增多(扩展功能的增多),各种子类的组合(扩展功能的组合)会导致更多子类的膨胀。
  • 如何使“对象功能的扩展”能够根据需要来动态地实现?同时避免“扩展功能的增多”带来的子类膨胀问题?从而使得任何“功能扩展变化”所导致的影响将为最低?

模式定义

动态(组合)地给一个对象增加一些额外的职责。就增加功能而言,Decorator模式比生成子类(继承)更为灵活(消除重复代码 & 减少子类个数)。 ——《设计模式》GoF

要点总结

  • 通过采用组合而非继承的手法, Decorator模式实现了在运行时动态扩展对象功能的能力,而且可以根据需要扩展多个功能。 避免了使用继承带来的“灵活性差”和“多子类衍生问题”。
  • Decorator类在接口上表现为is-a Component的继承关系,即Decorator类继承了Component类所具有的接口。 但在实现上又表现为has-a Component的组合关系,即Decorator类又使用了另外一个Component类。
  • Decorator模式的目的并非解决“多子类衍生的多继承”问题,Decorator模式应用的要点在于解决“主体类在多个方向上的扩展功能”——是为“装饰”的含义。

Ps. 装饰模式的使用更像是将统一模块中,不同的子功能一个一个单独独立出来,再根据实际环境中所需的单独子模块手动的去一层一层的套成一个套娃。(详情见代码:在底层逻辑上的做法,一般是将上一层的套娃使用继承,下一层的套娃使用组合(为了泛型,一般子模块为多态子类,且父类有统一的接口约束)也由于该做法的原因若是在代码中发现继承和组合是同一个类,大概率这就是装饰模式)

在运行时形成该模式的目的(需要使用者自行组合子模块,之后由多态 + 组合完成),而不是像大多数的设计模式在编译时。

Eg.
在这里插入图片描述

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

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

相关文章

<JavaEE> TCP 的通信机制(三) -- 滑动窗口

目录 TCP的通信机制的核心特性 四、滑动窗口 1)什么是滑动窗口? 2)滑动窗口的作用是什么? 3)批量传输出现丢包如何处理? 1> 接收端ACK丢包 2> 发送端数据包丢包 4)适用性 TCP的通…

【EasyExcel】使用技巧

文章目录 前言一、使excel中的公式生效二、待更新1.待更新 总结 前言 【EasyExcel】的使用技巧,随时间推移进行更新: 2023-12-26——【使excel中的公式生效】 提示:以下是本篇文章正文内容 一、使excel中的公式生效 ExcelWriter excelWrite…

为什么深度学习神经网络可以学习任何东西

下图你所看到的,是著名的曼德尔布罗特集,我们可以见证这个集合呈现出的复杂形态: 要理解神经网络如何学习曼德尔布罗特集,我们首先需要从最基础的数学概念讲起:什么是函数?函数本质上是一个将输入转化为输出…

机器学习---adaboost二分类、回归

1. adaboost二分类 import numpy as np import matplotlib.pyplot as pltfrom sklearn.ensemble import AdaBoostClassifier from sklearn.tree import DecisionTreeClassifier from sklearn.datasets import make_gaussian_quantiles# 几个关键参数有n_samples(生…

Python list列表中每一个数字乘于2的两种多功能函数代码设计

Python list列表中每一个数字乘于2或一个数字 要让Python中list列表中的每一个数字乘于2,可以有两种方法,一是使用列表推导式来完成,另一种是使用map()函数来完成。下面将通过实例代码来之一进行介绍。 列表推导式法 为了让列表推导式的代…

基于JSP+Servlet+Mysql的宠物管理系统(简单增删改查)

基于JSPServletMysql的宠物管理系统_简单增删改查 一、系统介绍二、功能展示1.主页2.增加3.修改4.查询5.删除 四、其它1.其他系统实现五.获取源码 一、系统介绍 项目名称:基于JSPServletMysql的宠物管理系统(简单增删改查) 项目架构:B/S架构 开发语言…

FonePaw iOS Transfer for Mac: 让您的IOS设备数据无忧传输

在数字世界里,随着我们的生活与科技越来越紧密,数据传输成为了我们日常生活中的重要部分。尤其对于广大的苹果用户来说,如何方便、快速地传输数据成为了他们关注的焦点。今天,我要为大家介绍一款专门为Mac用户设计的IOS数据传输工…

Objectiv-C设计模式笔记

文章目录 通用知识点对象创建原型模式定义适用场景示例 工厂方法定义适用场景示例 抽象工厂定义适用场景示例 生成器模式定义适用场景示例 单例模式定义适用场景示例 接口适配适配器定义适用场景示例 桥接定义适用场景示例 外观模式定义适用场景示例 对象去耦中介者定义适用场景…

60.0/PhotoShop制作简单的网页效果

目录 60.1 网页的页面元素 60.1.1 网页的概念 60.2网站设计的步骤 60.2.1草案 ​编辑 60.2.2 丰富内容 60.2.3 利用切片划分功能区域 60.3.0 Gif动画的制作 60.1 网页的页面元素 60.1.1 网页的概念 是指通过浏览器能访问到的 Web 页面,是一种超文本文件&am…

SpringBoot3 核心原理

1. 事件和监听器 1. 生命周期监听 场景:监听应用的生命周期 1. 监听器-SpringApplicationRunListener 自定义SpringApplicationRunListener来监听事件; 编写SpringApplicationRunListener 实现类在 META-INF/spring.factories 中配置 org.springfram…

同城配送小程序解决方案

前言 同城配送小程序解决方案。 一、用户用车 用户打开小程序后发货地址自动定位到用户当前位置,用户可通过地址后的>号在地图上选择新的发货地址和卸货地址,小程序会自动规划出行线路,计算距离和运费价格。 用户仅用简单操作后就可以…

冒泡排序(C语言)

void BubbleSort(int arr[], int len) {int i, j, temp;for (i 0; i < len; i){for (j len - 1; j > i; j--){if (arr[j] > arr[j 1]){temp arr[j];arr[j] arr[j 1];arr[j 1] temp;}}} } 优化&#xff1a; 设置标志位flag&#xff0c;如果发生了交换flag设置…

sql查找至少连续出现三次的数字

表&#xff1a;logss ---------------------- | column name | type | ---------------------- | id | int | | num | varchar | ----------------------id 是这个表的主键。 编写一个 sql 查询&#xff0c;查找所有至少连续出现三次的数字。 返回的…

C++ 文件操作篇

C 文件操作篇 文章目录 C 文件操作篇1 简介1.1 继承关系1.2 流1.3 缓冲区输入输出流中的缓冲streambuf 2 文件操作步骤2.1 头文件2.2 创建流对象2.3 打开文件2.4 读取数据第一种&#xff1a;**按元素直接读**第二种&#xff1a;**使用getline按行读**第三种&#xff1a;**使用*…

软文发稿:雅虎媒体套餐投放内容有哪些

在当今数字时代&#xff0c;软文发稿成为企业推广的重要手段之一。雅虎媒体套餐作为软文发稿的一个独特平台&#xff0c;吸引了众多企业的关注。本文将深入探讨雅虎媒体套餐投放的内容&#xff0c;以揭示其在软文推广中的独特价值。 雅虎作为全球著名的互联网公司之一&#xf…

ubuntu多用户环境dockerbug,卸载重装docker流程

之前不小心误操作删除重装docker&#xff0c;结果删除没成功&#xff0c;更没法重装&#xff0c;每次apt install都会报一个docker错误&#xff0c;虽然不影响软件的常规安装&#xff5e;但是现在还是需要装一个完整docker&#xff0c;还是选择删除一下&#xff0c;重点是关闭服…

❀My排序算法学习之选择排序❀

目录 选择排序(Selection Sort):) 一、定义 二、具体实现方法 三、算法性能 时间复杂度 稳定性 四、参考代码

探索中国制造API接口:解锁无限商机,引领制造业数字化转型

一、概述 中国制造API接口是一种应用程序接口&#xff0c;专门为中国制造行业提供数据和服务。通过使用API接口&#xff0c;开发者可以轻松地获取中国制造的商品信息、供应商数据、生产能力等&#xff0c;从而为他们的应用程序或网站提供更加丰富的内容和功能。 二、API接口的…

k8s---kubernets

目录 一、Kurbernetes 1.2、K8S的特性&#xff1a; 1.3、docker和K8S&#xff1a; 1.4、K8S的作用&#xff1a; 1.5、K8S的特性&#xff1a; 二、K8S集群架构与组件&#xff1a; 三、K8S的核心组件&#xff1a; 一、master组件&#xff1a; 1、kube-apiserver&#xff1…

【网络安全 | MD5截断比较】PHP、Python脚本利用

前言 在解题中&#xff0c;当遇到类似 substr(md5(a),-6,6) 7788这样的MD5截断比较的题目时&#xff0c;只有求出a的值才能进行接下来的操作。 一个一个去猜是不可能的&#xff0c;通常使用脚本解决&#xff0c;文末给出实战案例。 PHP循环脚本 <?phpfor($i1;$i<9…