设计模式之装饰模式

设计模式——装饰模式 装饰模式是一种用来替代继承的思想,它使用对象之间的关联关系来取代类之间的继承关系。继承是一种常用的一种拓展原有类的功能的方法,通过创建一个继承父类的子类来拓展原有的功能,在“合成复用原则”中曾提到,在处理类的功能拓展这个问题上应尽量使用类之间的关联关系而少使用继承关系。为什么要用这个模式:以对客户透明的方式动态地给一个对象附加上更多的责任,装饰模式可以在不需要创造更多的子类的情况下,将对象的功能加... 阅读详情

定义:动态的给一个对象添加额外的职责,就增加功能来说,装饰模式比给子类继承要灵活。

角色分析:
1. 抽象主体行为接口Component:规定添加装饰功能接口
2. 装饰角色类Deactor:持有Compoent对象的装饰类
3. 主体类CreateComponent:主体类接受装类所给的功能
4. 具体装饰类CreateDeactorA,CreateDeactorA:装饰具体的功能

示例代码

/**抽象主体行为接口 */
public interface Compoent {

    public void operation();
}

/**持有Compoent对象的装饰类*/
public class Deactor implements Component{

    protected  Component component;
    public void setComponent(Component component){
          this.component =component;
    }
    public void operation() {
          if(component !=null){
              component.operation();
         }
    }

}

/**主体类接受装类所给的功能*/
public class CreateComponent implements Component{

    public void operation() {
         System. out.println("具体对象的操作" );
    }

}

/**装饰具体的功能A*/
public class CreateDeactorA extends Deactor{


    public void operation() {
          super.operation();
         System. out.println("具体装修A的操作" );
    }

}
/**装饰具体的功能B*/
public class CreateDeactorB extends Deactor{


    public void operation() {
          super.operation();
         System. out.println("具体装修A的操作" );
    }

}

调用者
CreateComponent component=new CreateComponent();
CreateDeactorA a= new  CreateDeactorA  ();
CreateDeactorB b= new CreateDeactorB ();
a.setComponent(component);
b.setComponent(a);
b.operation();

图例UML
这里写图片描述

装饰:顾名思义就是额外的装扮,就像人一样,人是主体,但人需要衣服鞋子等等 ,并且我们经常换不同的款式和风格,有时候感觉设计模式也是源于生活。

以人穿衣服为例

public interface PersonOperation {

    void operation();
}

public class PersonDeactor implements PersonOperation{

    private PersonOperation personOperation;
    public void setPersonOperation(PersonOperation personOperation){
          this.personOperation = personOperation;
    }
    public void operation() {
          if(personOperation !=null){
              personOperation.operation();
         }
    }

}
public class Person implements PersonOperation{

    public String name;
    public Person(){}
    public Person(String name){
          this.name =name;
    }
    public void operation() {
         System. out.println(name +"穿了一件上衣" );
    }

}

public class PantsDeactor extends PersonDeactor{

    @Override
    public void operation() {
          super.operation();
         System. out.println("加了条裤子。。。" );
    }
}


public class ShirtsDeactor extends PersonDeactor{

    @Override
    public void operation() {
          super.operation();
         System. out.println("加了双鞋子" );
    }
}

Person person=new Person( "小花");
ShirtsDeactor deactor= new ShirtsDeactor();
PantsDeactor pantsDeactor= new PantsDeactor();
deactor.setPersonOperation(person);
pantsDeactor.setPersonOperation(deactor);
pantsDeactor.operation();

总结:装饰模式是为已有的功能动态的添加更多功能的一种方式,当系统需要新的功能的时候,是向旧的类中添加新的代码,这些新加的代码通常装饰了原有类的核心职责或主要行为

比如上面的例子:用鞋子和裤子装饰小花,如果在主类中加入新的字段和方法逻辑,从而增加了主类的复杂度。而装饰模式却提供了一个非常好的解决方案,把每个要装饰的功能放在单独的类中并让这个类包装它所以装饰的对象,客户端代码就可以在调用时根据需求有选择的按顺序的使用装饰功能包装对象.

装饰模式的优点:把类中的装饰功能从类中搬移去除,这样可以简化原有的类,有效地把类的核心职责和装饰功能区分开了,而且可以去除相关类中重复的装饰逻辑

RT-Thread stm32h7使用串口DMA stm32h7在rtthread中无法使用串口DMA,通过更改驱动代码使其支持串口DMA 阅读详情

相关推荐

PID不够用?试试用ADRC改造你的ArduCopter:从Simulink仿真到SITL测试全记录

本文详细介绍了如何将ADRC(自抗扰控制)算法集成到ArduPilot飞控中,以替代传统PID控制器。通过Simulink建模、参数整定和SITL仿真测试,展示了ADRC在抗扰动能力、响应速度和参数调节复杂度上的优势,特别适合无人机在强风扰动下的稳定控制。

weixin_32349093的博客 273

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

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

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

螺丝锁付系统软件设计 C# Winform

视觉螺丝锁付系统软件设计 C# Winform ,这是其中通信子模块设计

weixin_42522973的博客 340

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

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

su9257的博客 117

LangChain4j-针对性操作Function-call+系统预设角色

如果我们想要对一些敏感信息进行针对化的操作,不仅仅是接口大模型去进行回复。比如我们现在数据库里面有一些菜品,那么用户提问,店里有多少套餐,那么云端大模型肯定是不知道的,我们希望捕获这些关键字然后进行自己的业务查询或者处理,这个时候就可以使用function-call。

DDDDDouble的博客 454

STM32 野火MINI 用FontCvtST.exe 生成.c文件 写汉字到文本框 按钮上

STM32 野火MINI 用FontCvtST.exe 生成.c文件 写汉字到文本框 按钮上 参考了好多大神博客,自己写的过程中发现,还有些小细节。 一、打开Notepad写需要的字 另存为 UTF-16LE 也就是Unicode。 二、打开FontCvtST转 删掉所有字 读入test.txt里的字 选择刚才的test.txt 另存为.c文件 改个英文名 复制到RTOS的例程文件夹下 三、打开GUIBuilder 画一个这样的 保存之前要注意路径配置要在当前位置,否则存不上 生成的D

weixin_41376117的博客 1935

设计模式 | 装饰模式

1 | 装饰模式的概述 我们在了解装饰模式之前,先回顾下生活中的几个常见现象,举例如下: 新房的装修,房屋装修并没有改变房屋居住的本质,但可以让房屋变得更漂亮,更温馨,更实用,更满足居家需求。 相片的包装,照相馆中把原相片清洗出来后,会对上面做些包装/装饰,相片镀膜,添加相框等处理,让整体更加美观,防潮保存更长的时间。 在软件设计中,类似上面的场景我们也可以把对象在不改变结构的情况下对其加工扩展修饰,使得对象具有更加强大的功能,这种技术在设计模式中就叫装饰模式。装饰模式可以在不改变一个对象本身功能的基

ChaITSimpleLove的博客 4770

更新|芒果YOLOv8改进182:注意力机制MLLA:即插即用|融合 Mamba 设计精髓的线性注意力视觉Transformer

芒果YOLOv8改进:即插即用,最新注意力机制MLLA:融合 Mamba 设计精髓的线性注意力视觉Transformer

包括YOLOv5、YOLOv7、YOLOv8等模型改进 866

设计模式Python版 装饰模式

介绍了GOF设计模式中的装饰模式,用Python实现装饰模式的示例,以及装饰模式在Django中的应用。

分享、交流、合作 1284

2026全网最新华为OD机试真题目录A+B+C+D+E卷(持续收录中)-Python版

🔔本文收录于「最新最全华为OD机试真题(Python版)」专栏,手把手带你零基础教学华为OD机试。本题集提供最优题解思路,解题步骤,代码解析,复杂度分析及最优题解源码等,支持多语言题解,助你轻松拿捏OD机考,一举上岸!安利大家关注&&收藏&&订阅!题库正在疯狂收录中,up!up!up!! 🚫提醒:拒绝一切代考/替考,违法必究!本人所写题库均精心搜集于互联网。    💗订阅福利:一次订阅,可永久免费阅读,提供在线答疑解惑,后续题库更新皆可阅读使用!

**My Coding Family** 10万+

QProgressBar:常用接口、样式表及自定义进度条实现

在Qt开发中,QProgressBar 是一个非常常用的控件,用于显示任务的进度。无论是文件下载、数据处理还是其他耗时操作,QProgressBar 都能直观地展示当前进度。本文将详细介绍QProgressBar 的使用方法,包括常用接口、样式表设置,并额外补充一个自定义进度条的C++实现。

u011186532的专栏 1012

设计模式——装饰模式(Decorator)

要想正确理解设计模式,首先必须明确它是为了解决什么问题而提出来的。 设计模式学习笔记 ——Shulin 转载请注明出处:http://blog.youkuaiyun.com/zhshulin 1、概念         装饰模式又名包装(Wrapper)模式。装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。         但是纯粹的装饰模式很难找到,大多数的装饰模式的实现

在路上 5万+

手把手教你学Simulink--基础电机控制场景实例:基于Simulink的无刷直流电机六步换相仿真

摘要:本文详细介绍了基于Simulink的无刷直流电机(BLDC)六步换相仿真方法。文章首先阐述了BLDC六步换相控制的原理,包括霍尔传感器定位、六步换相逻辑和方波电流驱动三大支柱。然后通过电动工具(角磨机)应用场景,展示了如何在Simulink中搭建完整的六步换相系统:从主电路构建、霍尔信号生成、Stateflow换相逻辑实现到开环电压控制。仿真结果显示该系统具有低成本优势(仅需霍尔传感器),但存在±20%转矩脉动。文章还提供了核心代码实现,包括霍尔信号生成、六步换相状态机和转矩分析脚本,并对比了六步换相

MHD0815的博客 149

【设计模式】用Java实现装饰模式

装饰模式(Decorator Pattern)是一种结构型设计模式它允许在不改变现有对象结构的情况下,动态地将责任附加到对象上。装饰模式通过将对象包装在装饰器对象中,形成一条装饰链,每个装饰器对象都可以在被装饰对象的行为前后加上自己的行为。装饰模式的核心思想是通过组合而不是继承来扩展对象的功能。它遵循开放-关闭原则,即对扩展开放,对修改关闭,使得我们可以在不修改现有代码的情况下,灵活地添加新的功能。应用场景:需要在不改变现有对象结构的情况下,动态地为对象添加额外的功能。

分享Java硬核干货 1万+

android 蓝牙通讯demo

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

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

装饰模式——初学JAVA设计模式

文章目录一、基本概念模式角色二、简单实例实例一、变形金刚类图代码实现结果截图实例二、喜羊羊与灰太狼类图方式一:透明模式代码实现结果截图方式二:半透明模式+透明模式代码实现结果截图三、透明模式和半透明模式的区别辨析透明模式半透明模式四、小结优缺点适用场景 一、基本概念 装饰模式是一种用于替代继承的技术,它通过一种无须定义子类的方式来给对象动态增加职责,使用对象之间的关联关系取代类之间的继承关系。 装...

发子鸡的博客 1497

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

设计模式-装饰模式

1.装饰模式的定义及使用场景定义:装饰模式也称为包装模式,结构型设计模式之一,其使用一种对客户端透明的方式来动态地扩展对象的功能,同时它也是继承关系的一种替代方案之一。动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活使用场景: 需要扩展一个类的功能,或给一个类增加附加功能 需要动态地给一个对象增加功能,这些功能可以再动态地撤销 需要为一批的兄弟类进行改装或加装功能,当

黄俊彬 1627

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Java设计模式-装饰模式

装饰模式是一种非常有用的设计模式,它可以动态地为对象添加新的功能,而不需要修改原有的代码。通过定义一个抽象的装饰器类和具体的装饰器类,我们可以非常方便地扩展对象的功能,以满足不同的业务需求。虽然装饰模式增加了代码的复杂性和运行时开销,但是它在许多情况下仍然是一种非常有效的解决方案。

小薯条的博客 703

Java设计模式之装饰模式

装饰模式(Decorator Pattern)是一种结构型设计模式,用于在运行时动态地给对象添加额外的职责,而无需通过继承来扩展对象的功能。

LHR__123的博客 642

23种设计模式之装饰模式

装饰模式也称为包装模式,结构型设计模式之一,其使用一种对客户端透明的方式来动态地扩展对象的功能,同时它也是继承关系的一种替代方案之一。 装饰模式的定义 动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活装饰模式的使用场景 需要透明且动态地扩展类的功能时装饰模式的UML类图角色介绍: 抽象构建(Component):定义一个抽象接口,用以给这些对象动态地添加职责。 具

论一个程序员的自我修养 560

C++设计模式——装饰模式

前言 在实际开发时,你有没有碰到过这种问题;开发一个类,封装了一个对象的核心操作,而这些操作就是客户使用该类时都会去调用的操作;而有一些非核心的操作,可能会使用,也可能不会使用;现在该怎么办呢? 将这些非核心的操作全部放到类中,这样,一个类就包含了很多核心的操作和一些看似有关,但是又无关的操作;这就会使核心类发生“爆炸”的现象,从而使核心类失去了一定的价值,也使使用核心类的客户在核心操作和非核...

dqsjqian的博客 268
上一篇: 设计模式之设计原则
下一篇: java 代码书写规范
J_山寨少主
博客等级 码龄11年 1粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值