23种设计模式之装饰器模式傻瓜式理解

23种设计模式 -设计模式图解.7z 23种设计模式的特点定义、优缺点、使用场景,源码中如何使用,资料思维导图。总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 立即下载

装饰器模式

贴图在这里插入图片描述
在这里插入图片描述

代码

	package 案例1穿衣服;

//定义需要装饰的大体领域。人?房间?
//给定一个装饰动作。
interface 人 {
	public void wearClothes();
}

//量体裁衣,根据人去定义什么东西去装饰人。衣服?裤子?帽子?
abstract class 衣服 implements 人 {
	private 人 human;// 量体裁衣,需要一个人体模型

	public 衣服(人 human) {// 确保每次穿衣服的是人
		this.human = human;
	}

	public void wearClothes() {
		human.wearClothes();
	}
}

class 内衣 extends 衣服 {

	public 内衣(人 human) {// 确保穿内衣的是人
		super(human);
	}

	public void wear01() {
		System.out.println("第一步:套进一件很薄的内衣");
	}

	@Override
	public void wearClothes() {
		// TODO Auto-generated method stub
		super.wearClothes();
		wear01();// 穿内衣
	}
}

class 衬衣 extends 衣服 {

	public 衬衣(人 human) {
		super(human);
	}

	public void wear02() {
		System.out.println("第二步:扣上一件帅气的衬衣");
	}

	@Override
	public void wearClothes() {
		// TODO Auto-generated method stub
		super.wearClothes();
		wear02();
	}
}

class 外套 extends 衣服 {

	public 外套(人 human) {
		super(human);
	}

	public void wear03() {
		System.out.println("第三步:披上一件大气的外套");
	}

	@Override
	public void wearClothes() {
		// TODO Auto-generated method stub
		super.wearClothes();
		wear03();
	}

}

//定义被装饰者,被装饰者初始状态有些自己的装饰
class 老王 implements 人 {

	@Override
	public void wearClothes() {
		// TODO Auto-generated method stub
		System.out.println("今天衣服怎么穿呢");
	}

}

//测试类
public class 测试类 {
	public static void main(String[] args) {
		人 老王 = new 老王();
		衣服 cloths = new 外套(new 衬衣(new 内衣(老王)));
		cloths.wearClothes();

	}
}
  • List item

问1:装饰器模式里的装饰者为什么要用多态传入一个被装饰对象?
答:我认为这里问题是装饰者模式的核心,装饰者也要实现一个接口,通过接口多态可以接受任何实现该接口的类的对象。比方说这里的继承抽象装饰者的具体装饰者通过多态可以传入一个没有被装饰过的对象,也可以传入被装饰过对象,比方说,在内衣类里可以穿入一个裸体老王,也可以穿入已经穿了外套的老王,只是把内衣套在外套外层。同样这里能传入老王就能传入老张老李等等。

  • List item

问2:既然装饰者是因为需要多态实现接口,继承抽象装饰类。那被装饰者为啥还多此一举实现装饰接口人。比方说直接定义一个普通类“老王”不就得啦,为啥还要通过实现接口的方式呢?

答:同样还是因为多态,如果老王不实现接口“人”。那么具体的装饰者,比方说“内衣、衬衣、外套”等类想要修饰老王,那就只能在构造函数中接收老王,换成老张就修饰不了了。这是其中一个问题,还有一个致命的问题是。如果我们按照顺序穿衣服,那么“内衣”传入老王,“衬衣”类传入内衣,“外套”类类传入衬衣。这种穿衣服的顺序是不能乱的。如果老王实现了接口人。,“内衣、衬衣、外套”这些类也继承了实现接口人的抽象类“衣服”,那么他们的构造函数就可以通过多态传入任何实现接口人类或者实现接口的后代。这样的就给就是。穿内衣的不仅可以是老王,老张,老李都可以。而且不一定要先穿内衣。可以先穿衬衣,在穿内衣,再穿外套等。

  • List item

问题3:接口“人”存在的意义,多态的意义?
答:接口“人”里的方法,其实就是一个动作的规范,需要后代子孙都要做这个动作。多态是为了修饰范围更广,不仅修饰老王,还可以修饰老张、老李。其次是让修饰的顺序自由。可以随意乱穿衣服。

从jieba分词到BERT-wwm——中文自然语言处理(NLP)基础分享系列(12) 今天是本系列的最后一期,完整代码呈现Huggingface transformers平台上微调BERT-wwm-ext的过程方法。 阅读详情

相关推荐

Redis简介和项目应用

内存优先架构简介Redis的读写操作都是在内存中执行的,计算机内存的读写速度极快,比机械硬盘的读写快很多,因此也会比MySql采用机械读写的方式性能更高。但是这样会产生一个问题,当Redis重启之后,内存中的数据就会丢失,为了保证数据不会因为服务器重启而丢失,Redis实现了数据持久化的机制,这个机制会把数据存储到磁盘中,当服务器重启的时候,能够从磁盘中恢复原有的数据。

人工智能、机器学习 759

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

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

weixin_45538589的博客 2万+

一文带你了解SOA接口测试

了解汽车电子行业的人,近几年可能经常见到一个词“SOA”,那SOA具体是什么?作为测试人员应该要测试哪些内容呢?这篇文章就简单给大家介绍一下。SOA(Service Oriented Architecture)是一种面向服务的架构,最早应用于IT行业,虽然行业内对于SOA的定义没有一个统一的描述,但是总体而言,SOA把功能定义成为服务,服务带有明确的可调用接口,并可以通过网络调用。在汽车领域,对于高性能计算平台而言,为了实现域控制器以及区域控制器之间的互联互通和软硬分离、缩短开发周期等优势,也引入了SOA的

怿星科技的博客 7156

设计模式之装饰器模式

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

weixin_64366370的博客 3409

基于FFmpeg与Nginx的大华摄像头实时视频Web接入方案

本文详细介绍了一种基于FFmpeg与Nginx的大华摄像头实时视频Web接入方案。该方案通过FFmpeg将摄像头RTSP协议流转换为浏览器友好的HLS格式,并利用Nginx进行高效分发,最终结合Video.js构建前端播放页面,实现无需插件的跨平台实时监控。方案具有免费、轻量、稳定、易于部署的特点,适合中小企业、个人开发者快速搭建内部监控或展示系统。

weixin_28040125的博客 346

ORB-SLAM3在windows11下的编译使用

近期在学习SLAM,想部署一下ORB-SLAM3,但是自己电脑是win11系统,因此就想着在win11上部署一下。但是网上看了一些教程,有一些博客,但是可能不适合我这种情况把,就很纠结。先说下结果,配置成功,过程极其痛苦。

weixin_44457768的博客 6096

《设计模式》之装饰器模式

《设计模式》之装饰器模式

向上的"狼"的博客 1240

computer planetary——全球生物多样性信息机构 (GBIF)

正如npartitions所表明的,这个Parquet数据集是由许多单独的parquet文件组成的。(GBIF) 是一个由世界各国政府资助的国际网络和数据基础设施,提供记录物种发生的全球数据。重新处理数据的原因有多种,包括主干分类的更改,因此该日期不一定是发生记录最后更改的日期。GBIF 发生数据集结合了来自广泛来源的数据,包括来自自然历史博物馆的标本相关数据、来自公民科学网络的观察和自动环境调查。为了了解最常观察到的物种,我们将对数据集进行分组,并获得每个物种的计数。大多数字段名称对应于。

此星光明博客 1636

装饰器模式-Decerator

一、装饰者模式的概念和作用 装饰器模式又叫做包装模式(Wrapper)。装饰器模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。 在以下情况下应该使用装饰器模式: 1.需要扩展一个类的功能,或给一个类增加附加责任 2.需要动态的给一个对象增加功能,这些功能可以再动态的撤销 3.需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使其继承关系变的不现实。 二...

weixin_34092370的博客 183

RK3568平台(网络篇)添加网络交换芯片RTL8306M

该交换芯片支持I2C、SPI、mdio通信,但是看ast1520的uboot代码采用的是mdio去通信phy芯片的,所以暂时也先采用mdio的方式,需要配置相应的引脚才可以配置成mdio通信模式,具体的配置硬件工程师解决。RTL8306M芯片上可能没有提供MDC/MDIO接口,可以通过GPIO(General Purpose Input/Output)来模拟,GPIO可实现串行输入输出,且一般CPU上会提供很多GPIO接口供用户自定义使用。

weixin_49303682的博客 3936

【异常】OpenClaw认证 Please carry the API secret key in the ‘Authorization‘ field of the request header

OpenClaw助手Agent因401认证异常导致业务中断的排查方案。该异常由大模型API鉴权全量失败触发,主要根因包括API凭证配置错误、密钥过期、账号权限不足或请求格式不规范。解决方案分四级:优先校验并修正API密钥;排查账号状态与调用权限;检查请求格式规范;最后排查网络或服务商问题。建议建立密钥生命周期管理机制,定期监控额度,使用专用API密钥以规避类似问题。该异常属于凭证配置类故障,不影响系统稳定性。

奶爸的编程之路,也就一周冷个三天 465

《设计模式奇妙之旅》第1章 简介

第一章 1.1 什么要写这些博客? 在我决定写这些博客的时候、已经是我在在读软件工程的本科三年级了,这意味着我距离工作找实习、找工作的时间越来越近。但我似乎准备的并没有那么充分,在之前的技术学习路线中,学习得比较离散。接触前端开发的时间最长,后端也可以做些业务,接触过RoboMaster的机器人开发、学习过安卓应用开发。但始终有些东西非常困惑我,将来找工作时什么很重要呢,听说过别人说过编程四大件:计算机网络、操作系统、数据结构与算法、设计模式。 这些知识通常在我们的大学考试中只是一场场考试,大多数学生也

高万禄的博客 423

【个人成长笔记】在Ubuntu中安装RTL8188GU USB无线网卡驱动(Driver for Linux RTL8188GU)

这篇笔记提供了在Ubuntu系统中安装RTL8188GU无线网卡驱动的完整指南。主要内容包括:驱动程序的官方来源(Github链接)、详细安装步骤(通过git下载、编译安装等命令),以及将设备转换为USB网卡模式的关键指令。特别提醒每次开机都需要执行模式转换命令,因为设备默认会以U盘模式启动。文章以简洁的技术文档形式呈现,适合Linux用户快速查阅和操作。

yuhuasheng1997的博客 1827

图解设计模式笔记:装饰器模式

​ 在不改变原有对象的基础上,将功能附加到对象上,从而透明且动态的扩展类的功能。

雨过天晴的博客 254

深度学习工具包 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")

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

装饰器模式详解(与IO不解的情缘)

https://www.cnblogs.com/zuoxiaolong/p/pattern11.html 本章讨论一个与JAVA中IO有着不解情缘的设计模式,装饰器模式。 定义:装饰模式是在不必改变原类文件和使用继承的情况下,动态的扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。 这一个解释,引自百度百科,我们注意其中的几点。 1,不改变原类文件。 2,不使用继承。 3,动态扩展。 上述三句话一语道出了装饰器模式的特点,下面LZ给出装饰器模式的类图,先上图再解释。 从图中可以看到

yygr的博客 384

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

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

C++设计模式之装饰器模式(decorator)(结构型)

一、模式动机 比如,给自家宠物小狗的画框需要不同的颜色等。 一般有两种方式可以实现给一个类或对象增加行为: •继承机制,使用继承机制是给现有类添加功能的一种有效途径,通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法。但是这种方法是静态的,用户不能控制增加行为的方式和时机。 •关联机制,即将一个类的对象嵌入另一个对象中,由另一个对象来...

janeqi1987的专栏 1370

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

4)具体装饰(ConcreteDecorator)角色 : 它是抽象装饰类的子类,负责向构件添加。1)抽象构件(Component)角色 :它是具体构件和抽象装饰类的共同父类,声明了。3)抽象装饰(Decorator)角色 :它也是抽象构件类的子类,用于给具体构件增加。装饰模式(decorator pattern) 的原始定义是:动态的给一个对象添加一些额外的职责。的构建对象,实现了在抽象构建中声明的方法,装饰类可以给它增加额外的职责。定义的方法,并可以增加新的方法用于扩充对象的行为。

liang8999的博客 2427

设计模式之装饰者模式

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

sweet_sauce的博客 554

设计模式之装饰器模式(笔记)

设计模式之装饰器模式(笔记) 装饰器模式 如果我想要改变某个对象的行为,可以在运行时不用修改这个对象,也就是改变这个对象的行为而不用重写里边的内容,不用打开这个类文件修改内容。 如何做到呢? 第一种解释 将这个对象用另外一个对象包装一下,当外部发送消息给他的时候,包装的对象会先收到这个消息,然后内部的对象才会收到这个消息,内部对象再返回数据给外部对象,外部对象再返回给接收者,然后一直嵌套下去。 这就是装饰器模式。 第二种解释 中间的对象称为组件,包装这个组件的是一个装饰者,包装这个装饰者的也是一个装饰者,对

weixin_45622336的博客 144

设计模式之-装饰器模式

现在我们看到在showLogin函数里,即要负责打开登陆浮层,又要负责数据上报,这是两个层面的功能,在此处却被耦合在一个函数,使用AOP分离之后代码如下。许多客户端希望通过不同的方式来收到通知,例如通过发送短信、微信、QQ,那么此时我们就会去扩展 Notifier 这个类,创建一些子类。像这种场景下,最佳的解决方案是使用组合而非继承,这也是前面在介绍设计原则的时候,其中就提到了组合优于继承。这是一种结构型设计模式,允许你将对象(A)放入包含行为的特殊对象里面,从而为原来的对象(A)绑定新的行为。

syt_1013的博客 355

设计模式之装饰器模式:原理、实现与应用

装饰器模式是一种结构型设计模式,它允许你通过将对象放入包含行为的特殊封装对象中来为原对象动态添加新的行为。装饰器模式通过组合而不是继承来实现功能的扩展,从而提高了系统的灵活性和可扩展性。装饰器模式是设计模式中用于动态扩展功能的经典模式之一,适用于需要灵活地为对象添加功能的场景。通过掌握装饰器模式的原理、实现方式以及最佳实践,你可以在实际开发中更好地应用这一模式。希望本文能为你的设计模式学习之旅提供一些实用的指导!如果你有具体的需求或想要深入探讨某个主题,请告诉我,我可以进一步调整内容!

wenbin_java的博客 1136

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

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

xjj1314的专栏 460
上一篇: 23种设计模式之适配器模式傻瓜式理解
下一篇: 23种设计模式之代理模式傻瓜式理解
平庸小菜鸡
博客等级 码龄9年 32粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值