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

.NET 设计模式—装饰器模式(Decorator Pattern) 装饰者模式(Decorator Pattern)是一种结构型设计模式,它允许你在不改变对象接口的前提下,动态地将新行为附加到对象上。这种模式是通过创建一个包装(或装饰)对象,将要被装饰的对象包裹起来,从而实现对原有对象功能的增强和扩展。 阅读详情

装饰模式(Decorator)动态的给一个对象添加一些额外的职责,就增加的功能来说,装饰模式比生成子类更灵活(继承的方式,子类和父类存在耦合关系)。

在这里插入图片描述

一.Demo需求的提出:

假设现在有一个电脑城的装机报价单打印程序。程序需要根据用户不同的配置需求打印不同的的报价单。尝试写一段代码来呈现这个逻辑。

二.装饰器模式呈现代码:

`

class Quotation:
    def show(self):
        print('牛屁哄哄电脑公司装机报价单:')
        print('-' * 20)


class HardwareConfiguration():
    def __init__(self):
        self._quotation = None

    def set_quotation(self, quo):
        self._quotation = quo

    def show(self):
        pass


class MainBoard(HardwareConfiguration):
    def __init__(self):
        super().__init__()

    def show(self):
        self._quotation.show()
        print('技嘉Giga 9AP-TX: 1000')


class Memory(HardwareConfiguration):
    def __init__(self):
        super().__init__()

    def show(self):
        self._quotation.show()
        print('KingSton 8G  :  800')


class CPU(HardwareConfiguration):
    def __init__(self):
        super().__init__()

    def show(self):
        self._quotation.show()
        print('AMD 32Core  :  800')


class DisplayAdaper(HardwareConfiguration):
    def __init__(self):
        super().__init__()

    def show(self):
        self._quotation.show()
        print('ATI XXXX  :  1200')




class Printer(HardwareConfiguration):
    def __init__(self):
        super().__init__()

    def show(self):
        self._quotation.show()
        print('Printer  :  1000')


if __name__ == '__main__':
    quo = Quotation()
    cpu = CPU()
    mem = Memory()
    main_board = MainBoard()
    printer = Printer()

    #装饰过程1
    cpu.set_quotation(quo)
    mem.set_quotation(cpu)
    main_board.set_quotation(mem)

    main_board.show()


    #装饰过程2
    printer.set_quotation(quo)
    main_board.set_quotation(printer)
    cpu.set_quotation(main_board)
    mem.set_quotation(cpu)

    mem.show()

`

执行输出:

C:\Python36\python.exe D:/练习/设计模式复习/装饰器模式/decorator_rf.py
牛屁哄哄电脑公司装机报价单:
--------------------
AMD 32Core  :  800
KingSton 8G  :  800
技嘉Giga 9AP-TX: 1000
牛屁哄哄电脑公司装机报价单:
--------------------
Printer  :  1000
技嘉Giga 9AP-TX: 1000
AMD 32Core  :  800
KingSton 8G  :  800

Process finished with exit code 0

分析:

Quotation是报价单基本内容打印。程序可以根据不同用户的不同PC配置需求,去跟Quotation对象去添加装饰。CPU,Memory…每一种硬件的对象都是一种装饰。这样每一种装饰类就可以独立变化,没有相互耦合。

三.总结:

1.装饰模式是为已有功能动态添加功能的一种方式。

2.当需要执行特殊行为时,客户端代码就可以在运行时根据需要有选择地,按顺序的使用装饰功能包装对象了。

3.有效的把类的核心职责和装饰功能分开,而且可以去除相关类中重负的装饰逻辑。

【Java设计模式】Java设计模式之(十九)装饰器模式(Decorator Pattern) 这种类型的设计模式属于结构型模式。 一、装饰器模式介绍 1.1 含义 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。 1.2 适用场景 ① 扩展一个类的功能。 ② 动态增加功能,动态撤销。 1.3 主要解决 子类膨胀的问题。 一般的,我们为了扩展一个类经常使用继承方式实现 阅读详情

相关推荐

ThingsBoard 仪表板状态

请先通过阅读仪表板概述和仪表板入门案例来熟悉ThingsBoard的仪表板。文章希望通过浅显的文字描述什么是仪表板状态及如何使用。 概念 状态功能使得仪表板可以分层,配合小部件的动作,实现多层仪表板之间的跳转.每个状态对应一个仪表板的图层 每个仪表板有一个默认的根状态, 根状态可以理解为默认状态, 也就是打开仪表板默认展示的仪表板图层.编辑模式下, 点击右上角的图标来管理状态.添加多个状态后左上角出现状态切换(图层切换)下拉列表可以通过选中根状态复选框切换新的默认展示的状态/图层配合小部件的动作,实现状

物联网三分钟 2308

设计模式之装饰器模式详解

设计模式之装饰器模式详解 文章目录设计模式之装饰器模式详解一、什么是装饰者模式二、门面模式的角色组成四、门面模式示例五、门面模式优缺点 一、什么是装饰者模式 装饰器模式(Decorator Pattern) 也称为包装模式(Wrapper Pattern) 是指在不改变原有对象的基础之上,将功能附加到对象上,提供了比继承更有弹性的替代方案(扩展原有对象的功能),属于结构型模式。装饰器模式的核心是功能扩展,使用装饰器模式可以透明且动态地扩展类的功能。 二、门面模式的角色组成 外观角色(Facade):

weixin_45538589的博客 2万+

5分钟搞定:用Pyannote和Whisper实现带说话人分离的语音转文字(附完整代码)

本文详细介绍了如何快速构建一个集成了说话人分离功能的语音转文字系统。通过结合OpenAI的Whisper模型进行高精度语音识别和Pyannote模型实现说话人分离,并提供了完整的代码实现、环境搭建指南以及核心的对齐与合并逻辑,帮助开发者高效处理会议录音、访谈等多说话人音频,实现自动化转录。

threejs5artist的博客 635

装饰器设计模式

装饰器模式(Decorator Pattern)是一种结构型设计模式,用于在不修改原有对象的基础上动态地给对象添加新的功能。装饰器模式通过创建一个新的装饰器类,继承原有类的基本功能,然后扩展或覆盖原有功能。装饰器模式可以在运行时根据需要灵活地给对象添加或组合功能。

baidu_36775904的博客 687

MT4量化交易入门:手把手教你用MQL4编写第一个外汇EA(含完整代码)

本文详细介绍了如何使用MQL4在MT4平台上编写第一个外汇EA,涵盖从开发环境配置到均线交叉策略实现的完整流程。通过手把手教学和完整代码示例,帮助量化交易新手快速掌握外汇自动化交易的核心技术,实现高效的MT4量化交易系统。

mmm90的博客 525

STM32C8T6实战:用PID算法搞定超级电容的10W无线恒功率充电(附代码避坑)

本文详细介绍了如何使用STM32C8T6和PID算法实现超级电容的10W无线恒功率充电。通过优化硬件设计、动态调整PID参数以及三重滤波技术,解决了超级电容充电过程中的功率尖峰和效率问题。附有代码示例和调试经验,帮助开发者快速实现高效稳定的无线充电方案。

weixin_29190169的博客 405

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

1 定义 装饰器(Decorator)模式,也称为包装(Wrapper)模式,是继承关系的一种替代方案。指在不改变对象结构的情况下,动态的给对象添加一些功能。 2 优缺点 2.1 优点 装饰器是继承的有力补充,比继承灵活,在不改变原有对象的情况下,动态的给一个对象扩展功能,即插即用 通过使用不用装饰类及这些装饰类的排列组合,可以实现不同效果 装饰器模式完全遵守开闭原则 2.2 缺点 装饰器模式会增加许多子类,过度使用会增加程序得复杂性。 3 装饰器模式的结构与实现 装饰器模式的类图如下所示:

honor_zhang的博客 5278

关系代数表达式优化步骤

关系代数表达式优化步骤 本篇主要讲解怎么画查询语法树并对其优化,因为我在学关系代数的语法树的时候,在网上找不到比较详细的教法或者技巧,最后通过答案反推原理,所以想写一篇技巧来描述一下这类题的解题方法。 先上书内讲解 1、构造查询树 第一步:把用高级语言定义的查询转换为关系代数表达式 ★ 以 SELECT子向对应投影操作,以FROM字向对应笛卡尔积以 WHERE子句对应选择操作,生成原始查询树 ★ SQL语句转化为原始查询树 第二步:把关系代数表达式转换为查询树。 注: 查询树是一种表示关系代数表达式的树形结

m0_51718449的博客 7015

【设计模式】——装饰器模式(Decorator Pattern)

在软件开发中,设计模式是解决常见问题的最佳实践。装饰器模式(Decorator Pattern),又称为包装器模式(Wrapper Pattern),是一种结构型设计模式,它允许在不改变原有对象结构的基础上,动态地给对象添加一些新的职责(即增加其额外功能)。这种模式在C++中的应用广泛,特别适合于需要灵活扩展对象功能的场景。

J^T的博客 2034

Python爬虫实战:股票历史数据抓取与量化回测全流程详解

我们以**东方财富网(eastmoney.com)和雪球网(xueqiu.com)**为主要目标,演示如何爬取A股历史行情。最常用的HTTP请求库,简单易用,适合静态页面数据请求。本文详细介绍了从股票历史数据抓取到简单回测的完整流程,代码示例基于最新技术,结构清晰,适合初学者和进阶者学习量化投资实战。希望对你入门Python爬虫和量化交易有所帮助!

2201_76125261的博客 1778

C#面试题及详细答案120道(61-75)-- 多线程与异步

本文摘要了前后端面试题中关于线程与并发的核心知识点,包括线程与进程的区别(61题)、Thread/ThreadPool/Task的对比(62题)、线程安全实现方法(63题)、lock关键字的原理(64题)、Monitor类的进阶用法(65题)以及死锁的成因与避免(66题)。通过C#代码示例和表格对比,清晰展示了多线程编程的关键概念、应用场景及常见问题解决方案,适合开发者快速掌握面试高频考点。完整内容可访问专栏目录获取更多技术面试题解析。

大剑师兰特的GIS世界 1428

设计模式之装饰器模式

装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。

weixin_64366370的博客 3409

图像分割 - 使用Mask R-CNN模型在COCO数据集上进行图像分割任务

图像分割是计算机视觉领域的一个重要任务,它旨在将图像中的每个像素分类为对象或背景。Mask R-CNN是一种基于区域的卷积神经网络,可用于图像分割任务。它是Faster R-CNN的扩展,将目标检测与图像分割结合起来,能够同时检测和分割对象。在本博客中,我们将使用Mask R-CNN模型在COCO数据集上进行图像分割任务。我们将介绍如何下载和准备COCO数据集,以及如何使用Mask R-CNN模型进行训练和推理。

斌擎科技 1188

设计模式之装饰器模式(Decorator Design Pattern)

装饰器模式是常用设计模式之一,装饰器模式与代理模式非常像,区别是代理模式是原始功能上附加功能,而装饰器模式是增强原始功能。 代理模式:我(代理)不是你(原始类),我只是代表你的(部分或全部)能力,不会改变你的能力; 装饰器模式:我(装饰器)就是你(原始类),我是你的伪装,不仅有你的全部能力,还可以改变你的能力; //人类 interface HumanBeing { //速度 public void velocity(); //反应 public void reaction();

xjj1314的专栏 460

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

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

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

设计模式 15 Decorator Pattern 装饰器模式

Decorator Pattern 装饰器模式是一种结构型设计模式,它允许在运行时给对象添加新的行为或职责,而无需修改对象的源代码。这种模式通过创建一个包装对象,也称为装饰器,来包裹原始对象,装饰器对象与原始对象有相同的接口,因此可以在不改变客户端代码的情况下,增加或修改对象的功能。装饰器模式的优点包括:动态地给对象添加新的行为,而无需修改对象的源代码或继承结构。可以独立地增加对象的功能,因为每个装饰器都是独立的类。保持了类的单一职责,使得代码更易于维护和扩展。

jxusthusiwen的专栏 876

精雕软件(JDpaint) 5.5 绿色版

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

结构型设计模式: 装饰器模式(Decorator Pattern)

设计模式;结构型模式;结构型设计模式;装饰器模式(Decorator Pattern)Decorator模式能动态地给一个对象添加一些额外的职责。就增加功能来说, Decorator模式相比生成子类更为灵活。装饰器模式(Decorator Pattern)属于结构型模式,又称为包装器(Wrapper)模式。结构型模式涉及到如何组合类和对象以获得更大的结构;结构型类模式采用继承机制来组合接口或实现。

智能多媒体 523

假人有限元模型

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

【设计模式】深入解析装饰器模式(Decorator Pattern)

装饰器模式详解

qq_59344127的博客 1968

设计模式中的装饰器模式(Decorator Pattern)

在软件开发中,常常需要给某个对象**动态地添加额外功能**,同时又不想修改它的代码或使用子类继承。**装饰器模式(Decorator Pattern)** 正是为了解决这个问题而设计的,它提供了一种**灵活、可扩展**的方式来增强对象的功能。本文将详细介绍**装饰器模式的概念、应用场景,并通过 Python 代码示例来展示其实现方式**。

962

23种设计模式之装饰器模式(Decorator Pattern)

本篇文章将23种设计模式中的装饰器模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。

小威的博客 2万+

设计模式-08装饰器模式Decorator Pattern

装饰器模式是一种动态扩展对象功能的结构型设计模式。它通过将对象包装在装饰器类中,而非使用继承,实现了灵活的功能扩展。该模式适用于需要动态添加或撤销职责的场景,尤其当子类继承不适用时。典型实现包含组件接口、具体组件和装饰器类,通过多层包装实现功能叠加。示例展示了咖啡店场景,通过不同装饰器组合可灵活定制咖啡价格和描述。这种模式保持了类的单一职责原则,同时提供了比继承更灵活的功能扩展方式。

d3y1`5 81_09 1264

[设计模式] 装饰器模式(Decorator Pattern)

什么是装饰器模式? 装饰器模式又称为包装模式(Wrapper Pattern),属于结构型设计模式。顾名思义,这个模式是在不必改变原类和使用继承的情况下,动态的扩展一个对象的功能。它是通过创建一个包装对象,来实现功能的扩展。 为什么使用装饰器模式? 通过该模式的定义我们可以推测出该模式的优点,即:在不改变原类和使用继承的情况下,可以动态的扩展一个对象的功能。 在我们进行编码实践的过程中,通常是先完成某个类的基本功能,在后续的开发过程中在慢慢加入新的功能,所以扩展对象的功能这件事是不可避免的。那么通常来说,我

asd13518662的博客 315

设计模式 | 九、装饰器模式(与继承的区别,与适配器/代理的区别)[DecoratorPattern]

设计模式-装饰器模式:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。

GiraffePeng的博客 4954

设计模式之装饰器模式(decorator pattern)

装饰器模式主要对现有的类对象进行包裹和封装,以期望在不改变类对象及其类定义的情况下,为对象添加额外功能。是一种对象结构型模式。需要注意的是,该过程是通过调用被包裹之后的对象完成功能添加的,而不是直接修改现有对象的行为,相当于增加了中间层。类似于python中的@装饰器。 下面还是按照老规矩,先来了解一下该模式相关的概念和原理,然后通过两个具体的实例体会一下如何在实际开发中应用该模式。...

weixin_30362083的博客 214

java设计模式之装饰器模式(Decorator Pattern)

一、什么是装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。 在不想增加更多子类的情况下扩展类,动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类...

heidou_2016的博客 207

【设计模式】装饰器模式( Decorator Pattern)

​ 装饰器(Decorator)模式也可叫包装模式(Wrapper Pattern) ,是为已有功能动态添加更多功能的一种方式。装饰器通过新建装饰类,用来包装原有的类,在保证原有类结构完整的情况下添加新功能。此模式将原有类当做组件,或者为原有类新建一个抽象类当做组件接口,原有类和装饰类通过继承该抽象类来实现关联。当需要使用装饰功能时只需要让装饰类包装原有类的对象即可完成装饰。

櫆溟的博客 1306

设计模式之装饰器模式 (Decorator Pattern)

装饰器模式是一种动态扩展对象功能的设计模式,通过嵌套包装替代继承,实现功能的灵活组合。其核心是将功能扩展从"纵向继承"转变为"横向包装",每个装饰器持有被装饰对象并在调用前后添加行为。典型应用包括Python的@decorator语法和Java的IO流包装。该模式解决了继承导致的类爆炸问题,支持运行时动态配置,但会牺牲对象身份明确性并增加调试复杂度。适用于需要动态、可撤销添加职责且功能可任意组合的场景,体现了开闭原则的思想。

goodparty的专栏 1953
上一篇: 设计模式---中介者模式
下一篇: D-Link DIR505路由器溢出漏洞实战
牛屁哄哄叫兽
博客等级 码龄18年 56粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值