装饰模式

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

意图

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

适用性

以下情况使用Decorator模式:
  • 在不影响其它对象的情况下,以动态,透明的方式给单个对象添加职责。
  • 处理那些可以撤销的职责。
  • 当不能采用生成子类的方法进行扩充时。

结构


参与者

  • Component
     -定义一个对象接口,可以给这些对象动态地添加职责。
  • ConcreteComponent
     -定义一个对象,可以给这个对象添加一些职责。
  • Decorator
     -维持一个指向Component对象的指针,并定义一个与Component接口一致的接口。
  • ConcreteDecorator
     -向组件添加职责。

协作

Decorator将请求转发给它的Component对象,并有可能在转发请求前后执行一些附加的动作。

效果

1)比静态继承更灵活。
2)避免在层次结构高层的类有太多的特征。
3)Decorator与它的Component不一样。
4)有许多小对象。

实现

我们将创建一个 Shape 接口和实现了 Shape 接口的实体类。然后我们创建一个实现了 Shape 接口的抽象装饰类 ShapeDecorator,并把 Shape 对象作为它的实例变量。

RedShapeDecorator 是实现了 ShapeDecorator 的实体类。

DecoratorPatternDemo,我们的演示类使用 RedShapeDecorator 来装饰 Shape 对象。



步骤 1

创建一个接口。

Shape.java

public interface Shape {
   void draw();
}

步骤 2

创建实现接口的实体类。

Rectangle.java

public class Rectangle implements Shape {

   @Override
   public void draw() {
      System.out.println("Shape: Rectangle");
   }
}
Circle.java

public class Circle implements Shape {

   @Override
   public void draw() {
      System.out.println("Shape: Circle");
   }
}

步骤 3

创建实现了 Shape 接口的抽象装饰类。

ShapeDecorator.java

public abstract class ShapeDecorator implements Shape {
   protected Shape decoratedShape;

   public ShapeDecorator(Shape decoratedShape){
      this.decoratedShape = decoratedShape;
   }

   public void draw(){
      decoratedShape.draw();
   }	
}

步骤 4

创建扩展了 ShapeDecorator 类的实体装饰类。

RedShapeDecorator.java

public class RedShapeDecorator extends ShapeDecorator {

   public RedShapeDecorator(Shape decoratedShape) {
      super(decoratedShape);		
   }

   @Override
   public void draw() {
      decoratedShape.draw();	       
      setRedBorder(decoratedShape);
   }

   private void setRedBorder(Shape decoratedShape){
      System.out.println("Border Color: Red");
   }

步骤 5

使用 RedShapeDecorator 来装饰 Shape 对象。

DecoratorPatternDemo.java


public class DecoratorPatternDemo {
   public static void main(String[] args) {

      Shape circle = new Circle();

      Shape redCircle = new RedShapeDecorator(new Circle());

      Shape redRectangle = new RedShapeDecorator(new Rectangle());
      System.out.println("Circle with normal border");
      circle.draw();

      System.out.println("\nCircle of red border");
      redCircle.draw();

      System.out.println("\nRectangle of red border");
      redRectangle.draw();
   }
}

Android中的应用

在Android源码中,其中一个比较经典的使用到装饰模式的就是由Context抽象类扩展出的ContextWrapper的设计。继承结构如下图所示:


  • abstract class Context是抽象类就是装饰者模式的Component:组件对象接口。
  • 而真正的实现是在ContextImpl中完成,它继承自Context抽象类并实现抽象方法。是ConcreteComponent:具体的组件对象,实现组件对象接口,就是被装饰的原始对象。
  • 而Decorator所有装饰器的抽象父类是ContextWrapper。从代码上看是完全和装饰者模式一样的实现。内部持有一个Component对象,就是持有一个被装饰的对象。
  • Activity、Service和Application这些能够启动Activity的实现类就是具体的装饰器对象。

Oracle数据库安装图文教程 附百度云oracle Database 11g 安装包 一,Oracle数据库安装包下载 1.从Oracle官网下载所需的数据库安装包【下载需要注册登录Oracle账户】     http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html 2.此处有下载好的Oracle Database 11g Release 2  百度云网盘  提取码:z... 阅读详情

相关推荐

windows 下AD9361的 no-os master 工程搭建

参考网站: https://wiki.analog.com/resources/fpga/docs/build#windows_environment_setup https://wiki.analog.com/resources/eval/user-guides/ad-fmcomms2-ebz/software/no-os-setup 参考博客: https://blog.youkuaiyun.com...

Bronceyang的博客 7294

Java设计模式--装饰模式

意图 动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。 适用性 以下情况使用Decorator模式: 在不影响其它对象的情况下,以动态,透明的方式给单个对象添加职责。处理那些可以撤销的职责。当不能采用生成子类的方法进行扩充时。 结构 参与者 Component      -定义一个对象接口,

怪盗基德 391

基于PDF文档结构的数字隐写

PDF隐写

xiongshivigor的博客 1426

Java 设计模式-装饰器模式(Decorator)

    装饰器模式(Decorator Pattern)又名包装模式(Wrapper Pattern)。装饰模式以对客户透明的方式扩展对象的功能,是继承关系的一种替代。换言之,客户端不会觉得对象在装饰前和装饰后有什么不同。      装饰器模式(Decorator Pattern)中的各个角色: 抽象构件(Componet)角色:给出一个抽象接口,规范准备接收附加责任的对象。 具体构件...

技术分享 175

3D深度饼图的QT实现

首先,我们需要创建一个QT项目并创建一个窗口,用于显示我们的饼图。在QT Creator中,选择创建一个新的QT Widgets应用程序项目,并创建一个新的窗口类。在本文中,我将介绍如何使用QT实现一个3D深度饼图(Pie 3D)的可视化效果。在构造函数中,我们将创建一个饼图(QChartView)并设置饼图的数据。这是一个简单的示例,您可以根据需要自定义和扩展代码来创建更复杂的饼图。现在,我们已经完成了3D深度饼图的QT实现。您将看到一个具有相应数据的3D深度饼图显示在窗口中。3D深度饼图的QT实现。

CodeJolt的博客 277

从0到1构建数据分析AI Agent:数据采集、洞察生成与报告自动化

在企业数字化转型的今天,数据分析师80%的时间被消耗在重复取数、数据清洗、报表排版等低价值劳动上,真正用于深度业务洞察和决策支持的时间不足20%。本文将从核心概念、技术原理、代码实现、落地实践全维度,教你从0到1搭建一套完整的数据分析AI Agent系统,实现「用户用自然语言提需求→Agent自动采集多源数据→AI自动挖掘业务洞察→自动生成符合业务要求的多格式报告」的全链路自动化,平均可将需求响应速度从天级压缩到分钟级,释放70%以上的分析师人力成本。

AI Python 编程之道的博客 472

Java系列之装饰模式

一,写在前面     在学习装饰模式之前,建议先了解代理模式。装饰模式和代理模式的类图结构几乎一样,仅仅是使用的目的有所差异,对比学习有助于理解装饰模式的使用。     假设有一个接口Human,一个接口的实现类Man。人类Human是可以跑步的,但是不能飞。     如果想给人类加上飞翔的翅膀,可以有三种解决方案: 修改实现类Man的方法,但不符合开闭原则 给实现类Man添加一个子类,...

小王君的专栏 1万+

【nnUNetv2进阶】四、nnUNetv2 魔改网络-小试牛刀-加入注意力机制ChannelAttention

本文介绍了在nnunet中加入ChannelAttention的方法,按照本文教的教程,可以快速完成ChannelAttention的加入和自定义模型的跑通。

AI爱好者的博客,分享计算机领域相关知识 5801

java装饰模式实例解析

1、装饰模式概述: 装饰模式(Decorator Pattern):动态地给一个对象增加一些额外的职责,就增加对象功能来说,装饰模式比生成子类更为灵活。《设计模式的艺术》 使用场景: 现实生活中大家都会遇到的一种场景,当买了房子之后,可能都需要对房子进行装修,或是根据自己的一些喜好对房间进行二次的装饰来满足自己的需求。软件系统开发也如此,一个系统设计好之后,常常需要对系统进行扩展...

hb_csu的博客 5492

eNSP常见故障处理

eNSP无法启动设备一直停在#井号的问题的解决方案?

lvshiliang123的博客 2万+

ADB 安装教程:如何在 Windows、 Linux 上安装 Android Debug Bridge

本文介绍了在Windows和Linux系统上安装ADB(Android调试桥)的方法。对于Windows系统:1)从官网下载ADB工具并解压;2)通过命令提示符验证安装;3)配置环境变量以实现全局使用;4)再次验证全局ADB功能。Linux系统可通过包管理器直接安装(如Ubuntu使用apt,Fedora使用dnf),安装后同样需验证版本信息确认成功。两种系统安装完成后,都能通过"adb version"命令检查安装状态。

qq_53545309的博客 443

【深入设计模式】装饰模式—什么是装饰模式?装饰模式在源码中的应用

装饰模式——让你的代码锦上添花。装饰模式详解及装饰模式在源码中的应用

SK_Jaco的博客 1279

Newton & Nvidia 开源 GPU 加速机器人仿真器入门教程(一)

Newton 是一个 GPU 加速、可扩展和可微分的物理仿真引擎,专为机器人、研究和高级仿真工作流而设计。Newton 基于 NVIDIA Warp 并集成了 MuJoCo Warp,为用户和开发人员提供了高性能仿真、现代 Python API 和灵活的架构。

机器人控制与仿真应用 1482

装饰模式 – 半透明装饰模式

装饰模式 – 半透明装饰模式: 目录 I/O 应用 源码: 输入流 InputStream 应用: 读取txt文件: 结果: Poi读取excel文件: 读取excel代码: 测试: 结果: 总结: 在装饰模式的学习中,会出现一个透明装饰模式和半透明的装饰,是什么意思呢? 透明装饰模式 在透明装饰模式中要求客户端完全针对抽象编程,装饰模式的透明性要求客户端程序不应该将对象声明为具体构件类型或具体装饰类型,而应该全部声明为抽象构件类型。对客户端而言,具体构件类和具体装...

一路向前 664

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

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

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

设计模式之装饰模式

装饰模式是指动态地给一个对象增加额外的职责,就增加对象功能来说,装饰模式比生成子类实现更加灵活。装饰模式是一种用于替代继承的技术,通过使用对象之间关联关系替代之前的父子类的继承关系。在装饰模式中引入装饰类,在装饰类中既可以调用原有方法,也可以增加新方法。装饰模式包含以下几个角色:Component(抽象构件):是具体构件和抽象装饰类的公共父类,声明了在具体构件中实现的业务方法。

javaJasonjava的博客 689

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

装饰模式的知识

装饰模式定义: 在不改变原来类的基础上,动态的对这个类进行添加或者是删减功能的一种模式 在装饰模式中主要有四个角色组成: 抽象构件:定义一个接口或者是抽象类,规范接收的附加责任的对象 具体构件:定义一个将要接收附加责任的类 装饰角色:注入一个抽象构件的类,并且实现与构件的接口 具体装饰角色:负责给构件对象贴上“附加"标签 具体的代码格式如下: 这里主要是以火锅锅底的为一个例子来讲述装饰模式的 /** * @Author: Jason * @Create: 2019/12/28 19:16 * @De

a_liuren的博客 274

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

10、装饰模式

装饰模式 文章目录装饰模式概述结构结构实现练习源代码透明装饰模式与半透明装饰模式透明装饰模式半透明装饰模式装饰模式优/缺点与适用环境优点缺点适用环境 概述 装饰模式:动态地给一个对象增加一些额外的职责,就增加对象功能来说,装饰模式比生成子类实现更为灵活。装饰模式是一种对象结构型模式。 装饰模式是一种对象结构型模式,它以对客户透明的方式动态地给一个对象附加上更多的责任,可以在不需要创建更多子类的情况下让对象的功能得以扩展。 装饰模式是一种用于替代继承的技术,它通过一种无须定义子类的方式来给对象动态增加职责,使

阿涛的敲码时光 224
上一篇: 组合模式
下一篇: 外观模式
hunter800421
博客等级 码龄22年 60粉丝 97原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值