【浅谈设计模式】装饰器模式篇

用Multisim和74HC系列芯片,手把手教你搭建一个能“算数”的简易CPU模型 本文详细介绍了如何使用Multisim仿真软件和74HC系列芯片搭建一个简易CPU模型,重点解析了74HC194寄存器和74HC283加法器的核心功能与连接方法。通过分步图解和实战调试,帮助读者理解CPU工作原理,掌握数字电路设计的基本技能,适合计算机组成原理初学者和电子爱好者实践学习。 阅读详情

在这里插入图片描述

首先先说下装饰器模式是什么

官方:

装饰器模式(Decorator Pattern) 也称为包装模式(Wrapper Pattern) 是指在不改变原有对象的基础之上,将功能附加到对象上,提供了比继承更有弹性的替代方案(扩展原有对象的功能),属于结构型模式。

装饰器模式的核心是功能扩展,使用装饰器模式可以透明且动态地扩展类的功能。

大白话一点:

有点像是 组合, 就是 我不动原先的业务东西,但是 又想给这个业务东西 加点额外的职责东西。

  • 非入侵的。
  • 可拼凑的。


实战开搞

实例简述预热
ISurfTheInternetService 网上冲浪冲浪业务 接口 interface

FadInternetCafe implements ISurfTheInternetService 时尚网咖 实现冲浪业务接口,实现重写提供 网上冲浪方法
RetroInternetBar implements ISurfTheInternetService 复古网吧 实现冲浪业务接口,实现重写提供 网上冲浪方法
然后在这个原有的冲浪业务下, 不做代码入侵, 我们想给网上冲浪冲浪业务加一点额外的职责,比如XXX,XXX啥的xxx业务。

于是乎,我们开始玩装饰器设计模式

SurfDecorator implements ISurfTheInternetService 网上冲浪装饰器
怎么玩的?看代码, 后面还会说怎么多层装饰 。

事不宜迟。

① ISurfTheInternetService.java 网上冲浪冲浪业务 接口

/**
 * @Author: zhuzikai
 * @Date: 2022-10-07 15:18
 * @Description: 网上冲浪
 */
public interface ISurfTheInternetService {
 
    /**
     * 冲起来
     */
    void doSurfing();
}

② FadInternetCafe.java 时尚网咖业务实现类

import com.example.mydemo.service.ISurfTheInternetService;
import org.springframework.stereotype.Service;
 
/**
 * @Author: zhuzikai
 * @Date: 2022-10-07 15:21
 * @Description: 时尚 网咖
 */
@Service("fadInternetCafeService")
public class FadInternetCafe implements ISurfTheInternetService {
    
    @Override
    public void doSurfing() {
 
        System.out.println("在时尚 网咖 ,网上冲浪咯~");
 
    }
}

③ RetroInternetBar.java 复古网吧业务实现类

import com.example.mydemo.service.ISurfTheInternetService;
import org.springframework.stereotype.Service;
 
/**
 * @Author: zhuzikai
 * @Date: 2022-10-07 15:21
 * @Description: 复古 网吧
 */
@Service("retroInternetBarService")
public class RetroInternetBar implements ISurfTheInternetService {
 
    @Override
    public void doSurfing() {
        System.out.println("在复古 网吧 ,网上冲浪咯~");
    }
}

先到这, 写个controller方法,模拟平时搬砖真实场景 :

@Autowired
@Qualifier("fadInternetCafeService")
ISurfTheInternetService fadInternetCafeService;


@Autowired
@Qualifier("retroInternetBarService")
ISurfTheInternetService retroInternetBarService;


@GetMapping("/doTest")
public void doTest() {

    fadInternetCafeService.doSurfing();
    retroInternetBarService.doSurfing();
}

可以看到调用效果是这样的:
在这里插入图片描述

然后。

然后在这个原有的冲浪业务下, 不做代码入侵, 我们想给网上冲浪冲浪业务加一点额外的职责,比如XXX,XXX啥的xxx业务。

④ SurfDecorator.java 网上冲浪装饰器

/**
 * @Author: zhuzikai
 * @Date: 2022-10-07 15:29
 * @Description:
 */
public class SurfDecorator implements  ISurfTheInternetService {
 
    /**
     * 内部维护一个冲浪接口类
     */
    private ISurfTheInternetService surfTheInternetService;
 
    /**
     * 构造方法 把传入的 类 赋值给内部类
     * @param surfTheInternetService
     */
    public SurfDecorator(ISurfTheInternetService surfTheInternetService) {
        this.surfTheInternetService = surfTheInternetService;
    }
 
    /**
     * 增强的网上冲浪方法
     */
    @Override
    public void doSurfing() {
 
        System.out.println("SurfDecorator 模拟业务 增强器在玩一点很新的东西,可能是一些额外的职责业务....");
        //增强
        surfTheInternetService.doSurfing();
        System.out.println("SurfDecorator 模拟业务 增强器在玩一点很新的东西,可能是一些额外的职责业务,比如说是XXXX");
    }
    
}

然后我们通过装饰器去 调用方法,实现增强职责:

@GetMapping("/useDecoratorTest")
public void useDecoratorTest() {

    SurfDecorator fadInternetCafeDecoratorService = new SurfDecorator(fadInternetCafeService);
    fadInternetCafeDecoratorService.doSurfing();

    SurfDecorator retroInternetBarDecoratorService = new SurfDecorator(retroInternetBarService);
    retroInternetBarDecoratorService.doSurfing();
    
}

在这里插入图片描述

可以看到效果, 它装起来了 :

在这里插入图片描述



然后,如果我们想多层装饰, 也就是 ,针对不同也网上冲浪业务实现类,想装一层又一层,

比如 时尚网卡的网上冲浪业务, 网咖老板比较腹黑,不仅仅需要做 A 增强业务,

还想看看每个来上网的人到底是不是有钱人,所以想检测一下卡里面的钱有多少,好安排一些‘优质服务。


⑤ 又一层装饰器 RechargeDecorator.java :

ps :它继承了基本的网上冲浪装饰器, 然后增强了自己的检测充值金额业务方法。

/**
 * @Author: zhuzikai
 * @Date: 2022-10-07 15:29
 * @Description:
 */
public class RechargeDecorator extends SurfDecorator{
 
    public RechargeDecorator(ISurfTheInternetService surfTheInternetService) {
        super(surfTheInternetService);
    }
 
    @Override
    public void doSurfing() {
        super.doSurfing();
        checkRecharge();
    }
    private void checkRecharge(){
        System.out.print("RechargeDecorator 也在增强,看看这个货卡里面充了有多少,就来上网");
    }
    
}

然后看看 我们怎么玩 多层装饰:

@GetMapping("/moreDecoratorTest")
public void moreDecoratorTest() {

    //先装一哈
    SurfDecorator retroInternetBarDecoratorService = new SurfDecorator(retroInternetBarService);
    //再包装一哈
    RechargeDecorator rechargeDecorator = new RechargeDecorator(retroInternetBarDecoratorService);
    rechargeDecorator.doSurfing();

}


在这里插入图片描述


可以看到效果,它装起来了,又装起来了:


在这里插入图片描述

stm32H743IIT6 cubemx HAL USB UVC摄像头基础 stm32性能已经很强了, 可以驱动ov5640摄像头, 所以可以把摄像头接在stm32上, 当作一个摄像头驱动器, 连接到电脑上 开发环境: stm32cubemx 6.0.1 单片机: 自己做的stm32h743iit6核心板,兼容正点原子 学习资料: 圈圈学USB 鱼鹰谈单片机 从零开始学习USBhttps://to-run-away.blog.youkuaiyun.com/article/details/85038393 整个项目是基于CDC串口上修改 1 stm32 USB 代码概览 .. 阅读详情

相关推荐

基于多物理参数数据融合和先进人工智能算法的锂电池热失控监测传感器

基于多物理参数数据融合和先进人工智能算法的锂电池热失控监测传感器是多种方案中的优选项!是一种快速、准确、可靠、应用广泛的传感方案!可有效监测锂离子电池热失控风险,保障化学能储能电站安全!

chicheng_danxin的博客 2411

react+ts项目实战:如何使用withRouter?

1.我使用withRouter使解决什么问题? 我在项目中使用了antd的Menu组件,其中defaultOpenKeys和defaultSelectedKeys两个属性要是设为一个固定的值,每次刷新页面的时候路由不变,但导航的高亮项就会重回最初的状态,这跟实际需求不符,我需要高亮项跟路由是对应的。所以我需要把defaultOpenKeys和defaultSelectedKeys两个属性设置为一...

sinat_38757616的博客 4317

【学习笔记】人群归因分数 PAF 以及combined PAF(更新)

在此推荐2篇发表在lancet以及jama子刊上的paf文章,这两篇文章套路是一样的,只是在不同国家进行。希望对大家学习PAF有所帮助,后面有新内容也会继续分享,也欢迎大家分享使用R语言计算PAF的经验~~~的时候,先建立了相关矩阵,再做主成分分析,得到communality。详细信息大家可翻阅原文。

weixin_53499537的博客 1497

设计模式之装饰器模式

装饰器模式中新增加的功能一定要是在不改变原有实现的前提下,这也是设计模式中要遵循的开放封闭原则。通过采用组合而非继承的手法, Decorator模式实现了在运行时 动态扩展对象功能的能力,而且可以根据需要扩展多个功能。避免 了使用继承带来的“灵活性差”和“多子类衍生问题”。Decorator类在接口上表现为is-a Component的继承关系,即 Decorator类继承了Component类所具有的接口。

升级打怪记录 451

HEVC/VVC中R-Lambda码率控制算法原理

文章目录1. 比特分配1.1 GOP级比特分配1.2 帧级比特分配1.3 LCU级比特分配2. 码率控制2.1 λ的计算和更新2.2 参数QP的确定 VVC中码率控制算法沿用了HEVC中经典的R-λ码率控制模型,R-λ由中科大的李斌博士提出(详情参考JCTVC-K0103)。R-λ模型的基础为视频编码中 R(比特 bpp)和 D(失真 MSE)之间的双曲线模型,即 D(R)=CR−KD(R) = ...

Aidoneus_y 6136

从‘能看’到‘好看’:用Seaborn调色板让你的热力图在PPT和论文中脱颖而出

本文探讨如何利用Seaborn调色板提升热力图在PPT和论文中的视觉效果,从视觉心理学和场景适配角度出发,提供学术与商业场景下的配色方案和实战代码。通过优化色彩选择,使数据可视化更具专业性和吸引力,帮助读者快速理解关键信息。

weixin_30755393的博客 245

设计模式之装饰器模式的学习思考

装饰器模式(Decorator Pattern)属于设计模式里的结构型模式一种。白话地说,我们可以给一个类加一些它没有的功能比如:给一个圆加上颜色;给手机增加上网的功能等等它的实现思想: 一般是以抽象类的为装饰类,继承抽象类的子类具体实现装饰内容 组合思想,即被装饰的类的对象作为变量放置在抽象类内部,一般,为了实现给许多具有相同的特质的类统一装饰,我们会用接口来规范被装饰类 这就设计了多态 小例子:

L-Study 375

MRI图像切片(nii格式转2D)

代码参考:将一个MRI(nii格式)数据进行切片 想要批量抽取MRI数据的几个切片,借鉴了上述代码的Python版本,原始代码抽取了全部切片。本次实验主要是抽取sMRI的横断面(axial)方向的其中30张切片,数量根据自己需求可自行设置。 import scipy, numpy, shutil, os, nibabel import sys, getopt import imageio def niito2D(filepath): inputfiles = os.listdir(filep

chs_502的博客 7548

用心理解设计模式——装饰器模式 (Decorator Pattern)

前置文章:设计模式的原则 其他设计模式:用心理解设计模式专栏 设计模式相关代码已统一放至我的 Github 一、定义 结构型模式之一。 Attach additional responsibilites to an object dynamically keeping the same interface. Decorators provide a flexibl...

NRatel的博客 654

cuRobo 入门教程(一)基于CUDA的机器人运动规划加速库

cuRobo是一款基于CUDA加速的机器人算法库,提供运动学计算、碰撞检测、轨迹优化等功能。该库采用并行优化技术,在GPU上实现高效运算,比现有方案快60倍。cuRobo支持多种机器人模型和环境表示,包含正向/逆向运动学、无碰撞轨迹生成、模型预测控制等核心算法,并可与IsaacSim等仿真平台集成。其特点包括:1) 支持多种碰撞检测方式(长方体/网格/深度图像);2) 提供批量环境处理和实时世界更新;3) 通过CUDA Graphs加速优化迭代;4) 在Jetson Orin等平台实现毫秒级运动规划。安装支

2506_90492529的博客 1924

MIKE水动力笔记4_制作网格

建立水动力模型前的重要一步就是制作网格,本文所讲内容就是如何在MIKE中制作网格。

晏长街的博客 2万+

浅谈设计模式-装饰器模式

装饰器模式本质:动态组合

langfeiyes的博客 608

Python学习第32天:Web前端入门

本文介绍了Web前端开发三大核心技术:HTML、CSS和JavaScript。首先概述了HTML的发展历程和HTML5新特性,详细讲解了常用HTML标签如文本、列表、链接、图像、表格、表单等。其次介绍了CSS的基础语法、选择器、颜色字体设置、盒子模型和布局定位方法。最后简要提及JavaScript为网页添加交互功能的作用。文章为Python开发者提供了前端技术的基础知识,帮助理解网页的结构、样式和行为实现原理。

tigerhhzz的博客 1910

浅谈设计模式

设计模式就是为了解决某类重复出现的问题而出现一套成功或者有效的解决方案。 作用: 1.以一种标准的形式工广大开发人员使用,编于学习和交流,使新的开发者更容易理解设计思路, 实现可维护性。 2.可重用性,可复用性,避免重复性工作。 3.可扩展性,易于修改。 4.提高开发效率和软件质量。 uml类图 ...

baidu_16370559的博客 925

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

浅谈PHP设计模式的装饰器模式

浅谈PHP设计模式的装饰器模式

weixin_42100387的博客 265

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

浅谈Vue项目中用到的设计模式

的原则是找出程序中的变化,并将变化封装起来,实现高效的可复用性。核心在于意图,而不在结构。通过设计模式可以帮助我们增强代码的可重用性、可扩充性、 可维护性、灵活性。我们使用设计模式的最终目的是为了实现代码的。

Model_yc的博客 5242

10 浅谈 装饰器模式的理解与使用

在不改变现有类结构的情况下,为这个类添加一个新的功能,这就是装饰器模式 所属与结构型模式, 这种模式的特点是:需要创建一个装饰类来包装原有的类,并且提供额外的功能。 为了解决:平时使用继承的方式,会带入许多静态的方法,导致子类过度饱和,膨胀。 举例子:悟空拥有七十二变,不管它怎么变化,他的本质还是一只猴子,但是他又有变化后的一些本领(功能) 实现:装饰类包含原有类的...

Marc1999的博客 204

浅谈golang中的装饰器模式

来自一个大佬的博客,建议食用 设计模式不分语言,是一种思维层面的体现,但是不能在不同语言中使用同一套实现(每种语言有不同的特性),比如go,本身是没有继承一说,但是通过结构体的组合来实现语义上的继承。而多态也是通过接口的方式来实现的。 下方的图来自于大佬博客,贴在这里方便查看!!! 设计原则 设计模式 结构型模式 装饰器模式 主要解决继承关系过于复杂的问题,通过组合来代替继承,给目标类添加增强功能,作为包装。 type IDraw interface { Draw() string } type S

weixin_43471422的博客 692

java装饰器模式_浅谈Java设计模式之装饰器模式

装饰器模式是指允许对一个现有的对象加入其它额外的功能并且不改变其原来的结构,属于结构型模式。这种模式通常会创建一个装饰类来包装原有的类以达到装饰的效果。以下举一个电脑配置的例子说明。首先创建一个电脑的接口,给出两个抽象方法,分别是获取名字和获取价格:/***抽象电脑类*@author樱桃肉丸子*/publicinterfaceAbstractComputer{Stringname()...

weixin_36036271的博客 310

浅谈装饰器设计模式

浅谈装饰器设计模式一、概念二、结构如何理解装饰器设计模式的运行原理?下面给出一个简单的示例 一、概念 《Thinking in Java》: 装饰器模式使用分层对象来动态透明地向单个对象中添加责任。装饰器指定包装在最初地对象周围地所有对象都具有相同的基本接口。某些事物是可装饰的,可以通过将其它类包装在这个可装饰对象的四周,从而将功能分层,这使得对装饰器的使用是透明的——无论对象是否被装饰,你都拥...

进阶笔记 528

浅析Java IO 设计模式之—装饰器模式

浅析Java IO 设计模式之—装饰器模式 1        浅谈装饰器模式:(以下内容摘自《java与模式》)      装饰器模式(Decotator)又名包装(Wrapper)模式。包装模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。    装饰器模式以对客户透明的方式动态地给一个对象附加上更多的责任。换而言之,客户端并不会觉得对象在装饰前和装饰后有什么不同。装饰器模

bingliquhuo的专栏 1370

浅谈设计模式(二):装饰器模式|中介模式|原型模式

装饰器模式(Decorator Pattern) 装饰器模式可用来给一个类动态添加功能,将其装饰成一个新的类。这就是装饰器的概念。看到这里我们可能会想,要达到这种效果,我们用子类继承父类不就可以了吗? 没错装饰器模式,本身是一种继承的替代方案。那既然是替代方案,那么自然就有它不一样的地方。 具体区别在哪里呢? 请看 装饰器模式更灵活:继承时父子类的关系是静态的,而装饰器模式是动态...

kkkkk0826的专栏 366

浅谈Python设计模式 -- 装饰器模式

装饰器模式: 动态地给一个对象添加一些额外的职责。在增加功能方面,装饰器模式比生成子类更为灵活。 实现很简单,这里不介绍。

bocai_xiaodaidai的博客 177

浅谈几种设计模式

概括 本文会说一下几个阶段中的几种设计模式,分别是元素创建型:工厂模式、建造者模式和单例模式,结构型:适配器模式、装饰器模式和代理模式,行为型:命令模式、模板模式、观察者模式和职责链模式 元素创建型 元素创建型,顾名思义就是用来创建元素,元素创建型的设计模式目的就是规范创建方式 工厂模式 隐藏创建过程,暴露共同接口 exm: 在商店里下载游戏,同时初始化并运行,商店里有很多游戏,那么Game类进行游戏的各种操作,而Shop就相当于一个工厂,只负责调用去生产即可 class Shop { constr

weixin_48391468的博客 2744

浅谈Java设计模式

前言:设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对

比较喜欢、笑的博客专栏 2939
上一篇: 【MySQL运行原理篇】InnoDB整体架构
下一篇: Spring使用了哪些设计模式?
_Romeo
_Romeo 优质创作者: 后端开发技术领域 优质创作者: 后端开发技术领域
博客等级 码龄8年 2万+粉丝 104原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Romeo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值