装饰模式

概述

23种设计模式之一,英文叫DecoratorPattern,中文也叫装饰模式、修饰模式。装饰模式是在不改变类文件和不使用继承的情况下,运行期动态扩展一个对象的功能。原理是:增加一个修饰类包裹原来的类,包裹的方式一般是通过在将原来的对象作为修饰类的构造函数的参数。装饰类实现新的功能,但是,在不需要用到新功能的地方,它可以直接调用原来的类中的方法。修饰类必须和原来的类有相同的接口(没有接口可以直接继承自原来的类)。修饰模式是类继承的另外一种选择。类继承在编译时候增加行为,而装饰模式是在运行时增加行为。

UML

 

实现

Component.java,接口。

public interface Component {

   void operation();

}

 

ConcreteComponent.java,原有类实现(需要扩展)。

public class ConcreteComponent implements Component {

   public void operation() {

      System.out.println("具体对象的操作");

   }

}

 

 

Decorator.java,抽象修饰类。

public abstract class Decorator implements Component {

   protected Componentcomponent;

   public Decorator(Component component) {

      this.component = component;

   }

   public void operation() {

      if(component !=null)

        component.operation();

   }

}

 

ConcreteDecoratorA.java,实际修饰类A。

public class ConcreteDecoratorA extends Decorator {

   public ConcreteDecoratorA(Component component) {

      super(component);

   }

   @Override

   public void operation() {

      super.operation();

      System.out.println("对象A扩展的操作");

   }

}

 

ConcreteDecoratorB.java,实际修饰类B。

public class ConcreteDecoratorB extends Decorator {

   public ConcreteDecoratorB(Component component) {

      super(component);

   }

   @Override

   public void operation() {

      super.operation();

      System.out.println("对象B扩展的操作");

   }

}

 

DecoratorTest.java,客户端。

public class DecoratorTest {

   public static void main(String[] args) {

      Component component =

        new ConcreteDecoratorB(

        new ConcreteDecoratorA(

        new ConcreteComponent()));

      component.operation();

   }

}

 

输出结果:

具体对象的操作

对象A扩展的操作

对象B扩展的操作

 

上面客户端的调用方式是不是和如下的代码有些类似,没错,Java中的I/O类库使用的就是装饰模式。

BufferedInputStream bis =

new BufferedInputStream(

new FileInputStream(""));

 

上面就是装饰模式的模型,如果有不明白,可以结合代码、UML、定义一起看一下。

实例

 

需求

 

一个窗口系统中的窗口,允许这个窗口内容滚动,我们希望给它添加水平或垂直滚动条(维基百科)。

 

实现

 

Window.java,窗口接口。

public interface Window {

   public void draw();

   public String getDescription();

}

 

SimpleWindow.java,简单窗口,不带任何修饰。

public class SimpleWindow implements Window {

   public void draw() {  // draw window   }

   public String getDescription() {

      return "simple window";

   }

}

 

WindowDecorator.java,窗口装饰抽象类。

public abstract class WindowDecoratorimplements Window {

   protected WindowdecoratedWindow;// the Window being decorated

   public WindowDecorator(Window decoratedWindow) {

      this.decoratedWindow = decoratedWindow;

   }

}

 

HorizontalScrollBarDecorator.java,横向滚动条装饰类。

public class HorizontalScrollBarDecorator extends WindowDecorator {

   public HorizontalScrollBarDecorator(Window decoratedWindow) {

      super(decoratedWindow);

   }

   public void draw() {

      drawHorizontalScrollBar();

      decoratedWindow.draw();

   }

   private void drawHorizontalScrollBar() {

      // draw the horizontal scrollbar

   }

   public String getDescription() {

      return decoratedWindow.getDescription() + ", including horizontal scrollbars";

   }

}

 

VerticalScrollBarDecorator.java,纵向滚动条装饰类。

public class VerticalScrollBarDecorator extends WindowDecorator {

   public VerticalScrollBarDecorator(Window decoratedWindow) {

      super(decoratedWindow);

   }

   public void draw() {

      drawVerticalScrollBar();

      decoratedWindow.draw();

   }

   private void drawVerticalScrollBar() {

      // draw the vertical scrollbar

   }

   public String getDescription() {

      return decoratedWindow.getDescription() + ", including vertical scrollbars";

   }

}

 

DecoratedWindowTest.java,客户端。

public class DecoratedWindowTest {

   public static void main(String[] args) {

      // create a decorated Window with horizontal and vertical scrollbars

      Window decoratedWindow =

        new HorizontalScrollBarDecorator(

        new VerticalScrollBarDecorator(

        new SimpleWindow()));

      // print the Window's description

      System.out.println(decoratedWindow.getDescription());

   }

}

 

输出结果:

simple window, including vertical scrollbars, including horizontal scrollbars

 

将不同的装饰区分开来,并且和原有的窗口分开,这样通过包装,我可以创建一个只带横向(纵向)滚动条的窗口,也可以创建不带滚动条的窗口,任意组合。

总结

装饰模式是不使用继承的情况下,可以动态扩展一个类,并且比继承更灵活(上面的实例)。

【编译原理】龙书第三章作业答案 【编译原理】龙书第三章作业答案 练习3.1.1:根据3.1.2节中的讨论,将下面的C++程序划分成正确的词素序列。哪些词素应该有相关联的词法值?应该具有什么值? 答案: 左列为词素,右列为值,划分如下: < float> 值为它本身 <id,limitedSquare> 值为*limitedSquare指针 <(> 标点符号无值 ... 阅读详情

相关推荐

基于Python适用于YOLO目标检测算法的图片数据增强处理

为了增强模型的鲁棒性以及数据的丰富性,同 时为了防止由于数据过少发生过拟合,本设计对数 据集进行数据增强处理,包括随机亮度调节、随机 对比度调节、随机饱和度调节、加入高斯噪声、水 平翻转、运动模糊和旋转 15°

weixin_67136409的博客 700

扩展系统功能——装饰模式

尽管目前房价依旧很高,但还是阻止不了大家对新房的渴望和买房的热情。如果大家买的是毛坯房,无疑还有一项艰巨的任务要面对,那就是装修。对新房进行装修并没有改变房屋用于居住的本质,但它可以让房子变得更漂亮、更温馨、更实用、更能满足居家的需求。在软件设计中,我们也有一种类似新房装修的技术可以对已有对象(新房)的功能进行扩展(装修),以获得更加符合用户需求的对象,使得对象具有更加强大的功能。这种技术对应于一

Yuwen's Hero 3126

IGBT基础知识

IGBT

u010783226的专栏 1万+

Java23种设计模式/GOF设计模式--结构型型模式

目录 结构型模式 6、适配器模式(Adapter pattern) 7、代理模式(Proxy pattern) 8、装饰模式(Decorator pattern) 9、外观模式/门面模式(Facade pattern) 10、桥接模式(Bridge pattern) 11、组合模式/合成模式(Composite pattern) 12、享元模式(Flyweight pattern)...

主要作为个人的笔记用,Not For Everyone。 1188

展锐双摄帧同步实战:从配置到调试的完整避坑指南

本文深入剖析了在展锐平台上实现双摄帧同步的完整流程与核心技术。详细对比了硬件帧同步与软件帧同步的差异、应用场景及核心挑战,提供了从XML配置、驱动层适配到调试验证的实战指南。重点强调了硬件帧同步必须与固定帧率强绑定这一关键避坑点,并分享了针对景深虚化等场景的同步质量验证方法及长稳测试策略。

kiwi8的博客 402

scannet数据集下载文件

scannet数据集下载文件 由于大家会申请scannet数据集,审批比较慢,我将下载的文件里面的内容贴出来,大家可以复制放进py文件中,运行就可以下载 ps:别再私信要数据集了,这个自己下载,如果光三维数据的话,还是很快的,当然如果路由器翻了墙的话,下载会更快。 #!/usr/bin/env python # Downloads ScanNet public data release # Run with ./download-scannet.py (or python download-scannet.

weixin_40766438的博客 9234

设计模式_装饰模式概述和使用

package cn.itcast_02; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.util.Scanner; public class PhoneD

辐_射的博客 470

电商订单系统设计简析(一)

电商所有模块中,订单系统作为最为核心的模块,决定了整个流程能不能顺畅的执行,起着承上启下的作用。相信很多PM都不陌生,到了一家电商公司,总会觉得公司现有的流程有不少问题,因为问题来自四面八方,一下子摸不着到底是哪里出了问题,PM就跟补丁师傅一样,遇到一个补一个。其实很多日常开发和测试提得需求都是表面需求,而这些表面上呈现出的各种问题,都是源自于流程上的不完整或者流程上某个环节上的缺失导致的。订单系...

野蛮非先生的博客 9554

Java系列之装饰模式

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

小王君的专栏 1万+

慕课软件质量保证与测试(习题集)

慕课金陵科技学院.软件质量保证与测试.期末复习.习题汇总0 总目录1 绪论1.1 软件质量保证与测试的产生与发展1.2 软件缺陷,软件错误,软件故障1.3 软件质量保证与测试的意义,原则和挑战1.4 单元测试1.5 课后作业2 软件测试策略2.1 软件测试的模型,过程和生命周期2.2 软件测试的方法和技术2.3 单元测试2.4 课后作业3 黑盒测试3.1 黑盒测试概述3.2 等价类划分测试3.3 边界值测试3.4 错误推测法3.5 判定表驱动法3.6 因果图法3.7 场景法3.8 正交实验法3.9 单元测试

weixin_42473228的博客 5万+

YOLO26-seg分割优化:FPN涨点&轻量化篇 |多级特征融合金字塔(HS-FPN),助力小目标检测

​​​​​摘要:本研究对Ultralytics YOLO26进行了全面分析,重点阐述了其关键架构改进及其在实时边缘目标检测中的性能基准测试。YOLO26于2025年9月发布,是YOLO系列最新、最先进的成员,专为在边缘及低功耗设备上实现高效、精确且易于部署的目标而构建。本文依次详述了YOLO26的架构创新,包括:移除了分布焦点损失(DFL);采用端到端的无NMS推理;集成了渐进损失(ProgLoss)与小目标感知标签分配(STAL);以及引入了用于稳定收敛的MuSGD优化器。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 283

java装饰模式实例解析

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

hb_csu的博客 5493

【KingSCADA】如何建立硬件系统及相关变量

本篇主要讲解如何定义设备,如何定义变量。KingSCADA3.8的采集系统是指负责和现场设备进行通讯,并采集现场数据和控制现场数据的模块,称之为采集器,也叫IOServer应用,它是一组独立的应用程序,可以脱离KingSCADA3.8软件,它依赖于KingSCADA3.8驱动产品,通过驱动与IO设备进行通讯。采集系统由通讯链路,设备,数据块组成。链路:链路是指计算机通过什么方式(接口)与设备进行连接,链路类别:串口,以太网,GPRS,Modem,通信卡,采集卡,无链路。

做有价值的事,积累有价值的笔记! 1万+

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

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

SK_Jaco的博客 1280

精雕软件(JDpaint) 5.5 绿色版

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

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

重新认识装饰模式--装饰模式实现AOP

一、AOP是什么 AOP:面向方面编程,他是一种编程范式,提供从另外一个角度来考虑程序结构以完善面向对象编程。 二、AOP的功能       在系统开发过程中会有一些共性的功能,这是面向对象的纵向思考方式就能解决问题了,这时候AOP横向延伸就可以解决这些公共服务织入系统中。AOP能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任,比如事务处理、日志处理、权限控制封装起来,便于减少系

wangdan1030的博客 8149

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

设计模式之装饰模式

 装饰模式又名包装(Wrapper)模式。装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。 装饰模式的结构   装饰模式以对客户透明的方式动态地给一个对象附加上更多的责任。换言之,客户端并不会觉得对象在装饰前和装饰后有什么不同。装饰模式可以在不使用创造更多子类的情况下,将对象的功能加以扩展。   装饰模式的类图如下:      在装饰模式中的角色有:   ●  抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象。   ●  具体构件(Con

用键盘与世界交流 1123

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

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

java中的装饰模式

装饰模式 特征:为接口增强性能 必须有一个装饰的对象 必须拥有与被装饰对象相同的接口 可以给被装饰对象添加额外的功能。 装饰器通过包装一个装饰对象来扩展其功能,而又不改变其接口,这实际上是基于对象的适配器模式的一种变种。他与对象的适配器模式有异同点。 相同点:都拥有一个目标对象 不同点:适配器模式需要实现另外一个接口,而装饰器模式必须实现该对象的接口。 典型的装饰器模式图: 简单...

兰枫 2390

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

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

一路向前 664
上一篇: hive日常积累优化技巧
下一篇: 用Sqoop把数据从HDFS导入到MYSQL
weixir123
博客等级 码龄16年 1粉丝 207原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值