装饰者模式之通俗易懂

用Python打造IPTV直播源自动抓取与测速工具,告别手工整理 在流媒体与网络电视场景中,IPTV直播源的管理一直是工程实践里的高频痛点:格式杂、命名乱、失效快。利用Python网络编程与数据解析能力,可以构建一套自动化的频道列表抓取与检测系统。核心思路是将多数据源获取、标准格式解析、关键词过滤与并发测速串联成一条流水线,借助requests、lxml与asyncio等工具,实现对m3u、JSON、TXT等常见源的高效处理。通过真实读取流媒体数据并综合评分,替代传统ping的单一可靠性判断,从而大幅提升直播源的可用性筛选效率。这套方案不仅适用于个人维护自定义播放列表,也 阅读详情

1、是什么

一句话:需要包装,但不改变本质(同宗同源)。

在不改变原有对象的基础之上,将功能附加到对象上。提供了比继承更有弹性的替代方案(扩展原有对象功能)
特点:
1、注重覆盖、扩展。
2、装饰器和被装饰器都实现同一个接口,主要目的是为了扩展之后依旧保留 OOP 关系(同宗同源)。
3、满足 is-a 的关系。

2、有什么用?

扩展一个类的功能或者给一个类添加附加职责
给一个对象动态的添加功能,或动态撤销功能。

IO 流包装

FilterInputStream filterInputStreasm = new BufferedInputStream(new FileInputStream(new File("/user/a")));

前台表单页面填写中文,通过servlet请求传递到后台,如果不经过任何处理,前台默认通过UTF-8编码,后台默认iso-8859-1解码,编码方式的差异难免造成乱码问题,可以用装饰者模式处理该问题。

数据源包装
在我们的项目中遇到这样一个问题:我们的项目需要连接多个数据库,而且不同的客户在每 次访问中根据需要会去访问不同的数据库。我们以往在 Spring 和 Hibernate 框架中总是配置一个数据 源,因而 SessionFactory 的 DataSource 属性总是指向这个数据源并且恒定不变,所有 DAO 在使用 SessionFactory 的时候都是通过这个数据源访问数据库。但是现在,由于项目的需要,我们的 DAO 在 访 问 SessionFactory 的 时 候 都 不 得 不 在 多 个 数 据 源 中 不 断 切 换 , 问 题 就 出 现 了 : 如 何 让 SessionFactory 在执行数据持久化的时候,根据客户的需求能够动态切换不同的数据源?我们能不能 在 Spring 的框架下通过少量修改得到解决?是否有什么设计模式可以利用呢? 首先想到在 Spring 的 ApplicationContext 中配置所有的 DataSource。这些 DataSource 可能是各 种不同类型的,比如不同的数据库:Oracle、SQL Server、MySQL 等,也可能是不同的数据源:比如 Apache 提 供 的 org.apache.commons.dbcp.BasicDataSource 、 Spring 提 供 的 org.springframework.jndi.JndiObjectFactoryBean 等。然后 SessionFactory 根据客户的每次 请求,将 DataSource 属性设置成不同的数据源,以到达切换数据源的目的。 Spring 中用到的包装器模式在类名上有两种表现:一种是类名中含有 Wrapper,另一种是类名中含有 Decorator。基本上都是动态地给一个对象添加一些额外的职责。

简历包装

3、怎么用?

一般当我们需要在具体的类中都需涛执行一些特定的操作时。我们一般就会使用抽象类,并定义抽象方法。

要点:
(1)抽象组件(Component):给出一个抽象接口,以规范准备接受附加责任的对象。
(2)被装饰者(ConcreteComponent):Component的具体实现,也就是我们要装饰的具体对象。
(3)装饰者组件(Decorator):持有组件对象的实例引用,该类的职责就是为了装饰具体组件对象,定义的基类。
(4)具体装饰(ConcreteDecorator):负责给构件对象装饰附加的功能。

总结起来就是,如果想对一个行为在不改变原来基础上加新功能和扩展,首先先把该行为抽象出来。然后实现抽象行为,原来的行为具体实现该抽象行为,创建一个抽象行为也实现同一个抽象行为,如果要装饰的时候,再在具体实现该装饰抽象类。

使用案例:

绞尽脑筋想不到很好的案例,网上很多其他的案例可以参考,但大部分都是卖东西

下面就结合自身写个案例吧
作为一名技术宅程序员,166的身高普通的样貌,不善言辞的嘴巴,至今一直单身,家里人为止着急上火,本人也很无奈,被嫌弃太多,习惯成自然,以后要自信。

下面用装饰模式给自己装饰一番,看魅力值有没有提高半分。

开撸:

//原来抽象 的我

public interface AbstractMyself {
    //身高
    public long getHeight();

    //样貌
    public String getAppearance();

    //言谈
    public String getSpeech();
}

//原來的我

public class Myself implements AbstractMyself {
    @Override
    public long getHeight() {
        return 166;
    }

    @Override
    public String getAppearance() {
        return "普通";
    }

    @Override
    public String getSpeech() {
        return "不善言辞";
    }
}

//抽象装饰后的我

public abstract class AbstractDecorator implements AbstractMyself {

    private AbstractMyself abstractMyself;

    public AbstractDecorator(AbstractMyself abstractMyself) {
        this.abstractMyself = abstractMyself;
    }

    @Override
    public long getHeight() {
        return this.abstractMyself.getHeight();
    }

    @Override
    public String getAppearance() {
        return this.abstractMyself.getAppearance();
    }

    @Override
    public String getSpeech() {
        return this.abstractMyself.getSpeech();
    }
}

//具体装饰后的我

/**
 * 提升后的我
 */
public class PromoteMyself extends AbstractDecorator {

    public PromoteMyself(AbstractMyself myself) {
        super(myself);
    }

    //穿增高鞋
    @Override
    public long getHeight() {
        return super.getHeight() + 8;
    }

    @Override
    public String getAppearance() {
        return "保养皮肤";
    }

    @Override
    public String getSpeech() {
        return "多读书,多当众讲话";
    }
}

//测试

public class Test {
    public static void main(String[] args) {
        //原来的我
        AbstractMyself myself = new Myself();
        System.out.println(myself.getAppearance() + myself.getSpeech() + myself.getHeight());
        //裝飾后的我
        PromoteMyself promoteMyself = new PromoteMyself(myself);
        System.out.println(promoteMyself.getAppearance() + promoteMyself.getSpeech() + promoteMyself.getHeight());

    }
}

在这里插入图片描述

YOLOv11多模态融合实战:基于YOLOFuse的RGB与红外线(IR)协同检测技术解析 本文深入解析了基于YOLOv11的YOLOFuse多模态融合技术,重点探讨了RGB与红外线(IR)协同检测的实现原理与实战应用。文章详细介绍了双流架构与数据级、特征级、决策级三种融合策略,并通过实战案例展示了其在低光照、复杂环境下显著提升检测精度与鲁棒性的优势,为全天候安防、自动驾驶等场景提供了有效的技术解决方案。 阅读详情

相关推荐

通俗地解释一下 EMD(经验模态分解,Empirical Mode Decomposition)

EMD 就像把一碗“混在一起的面条”分成不同粗细的面条,方便你逐层分析每种波动。

qlkaicx的博客 1247

装饰者模式(通俗易懂)

星巴克咖啡订单项目(咖啡馆): 咖啡种类/单品咖啡:Espresso(意大利浓咖啡)、ShortBlack、LongBlack(美式咖啡)、Decaf(无因咖啡) 调料:Milk、Soy(豆浆)、Chocolate 要求在扩展新的咖啡种类时,具有良好的扩展性、改动方便、维护方便 使用OO 的来计算不同种类咖啡的费用: 客户可以点单品咖啡,也可以单品咖啡+调料组合。 方案1-解决星巴克咖啡订单项目 方案1-解决星巴克咖啡订单问题分析 Drink 是一个抽象类,表示饮料 des 就

笔记别偷看 9679

SPI 协议帧格式深度解析:从 8 位数据到 16 位扩展的 3 种模式

本文深入解析SPI协议的帧格式,涵盖从8位标准到16位扩展的三种模式。通过详细讲解SPI时钟模式、数据宽度配置及实际应用案例,帮助开发者掌握SPI外设的深度定制能力,提升嵌入式系统开发效率。特别适用于连接传感器、存储器和显示器等高速通讯场景。

weixin_34110749的博客 345

这是我见过最通俗易懂的 装饰者模式 讲解了!

作者:lewis0077cnblogs.com/lewis0077/p/6174374.html1.什么是装饰者模式 动态给对象增加功能,从一个对象的外部来给对象添加功能,相当于改变了对...

Java知音 769

逆向攻防世界CTF系列40-ReverseMe-120

注意sub_401000main中只传了两个参数,但是跟进后发现四个(可能是隐式传递,放在寄存器里传递了),调试发现a4是输入长度,与最终的you_know_how_to_remove_junk_code比较的是v12(但是并没有被传入),开始怀疑是不是隐式传递了。_mm_xor_si128用于计算128位(16字节)的按位异或,然后通过v14控制循环结束的条件,可以看到v14增长的步长为16,而且通过上面得到的flag值解码得到的字符串为32个字节大小,正好是16的整数倍。

LH1013886337的博客 1407

ArcGIS Pro新手避坑:从OpenStreetMap导入路网到创建拓扑关系全流程

本文详细解析了ArcGIS Pro中从OpenStreetMap导入路网数据到创建拓扑关系的全流程,涵盖OSM数据特性、几何完整性检查、属性强化及拓扑关系构建等关键步骤。特别针对路网数据预处理、网络数据集配置和常见问题提供了实用解决方案,帮助GIS新手高效完成网络分析任务。

weixin_33670786的博客 514

不一样解释的装饰者模式

       先说一下为什么写这篇文章,因为装饰者模式有很多了,为什么还要重复地写呢?写它主要是因为它不一样,不一样在对定义的解释,与见解。这里建议你已经知道装饰者的基本写法了。首先看一下维基百科对装饰者的解释:通过使用修饰模式,可以在运行时扩充一个类的功能。原理是:增加一个修饰类包裹原来的类,包裹的方式一般是通过在将原来的对象作为修饰类的构造函数的参数。装饰类实现新的功能,但是,在不需要用到新功...

huihuishou_su的博客 308

AD20/Altium designer——如何进行DRC检查、冲突的错误如何改正

对于一个画完的PCB,我们常常需要进行DRC检查,确保板子的电器连接及制作工艺在设定规则的范围内,本篇将介绍如何对PCB进行后期DRC检查处理,确保电路板出现不必要错误。 1.DRC检查入口 2.DRC设置 3.错误分析 对于错误的内容,依据个人实际情况不同,其出现的原因都是因为与设计规则中的设定标准冲突,这里按遇到的错误进行修改讲解,其他错误同理。 4.常见错误分析及解决方法 (1) 解决方法:将未连接网络连接(...

嵌入式创客工坊的博客 5万+

通俗易懂设计模式解析——装饰模式

前言   今天介绍的是结构型设计模式中的——装饰模式(Decorator Pattern),也是装饰器模式。装饰也就是装点修饰。例如我们对手机进行装饰,买了一个新的手机,先贴个钢化膜。在带一个壳。偶尔还在背面贴点贴纸。装一些挂件。这些等等行为也就是装饰。生活中的装饰是如此,那么编程中的装饰模式又是如何呢? 装饰模式介绍 一、来由   在我们平常的软件系统中,经常会面临着向现有的对...

dingxian9983的博客 367

Altium Designer(AD)仿真实验操作指南

1:运行仿真2:设置仿真3:放置电源模块4:放置器件模块5:探针。

XU157303764的博客 8891

模型实战(31)之 yolo26 实现对手部关键点数据集 的训练与关键点检测

模型实战(31)之 yolo26 实现对手部关键点数据集 的训练与关键点检测

yohnyang的博客 208

通俗易懂的装饰器模式

装饰模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。 介绍: 意图: 动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。 主要解决: 一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。何时使用:在

Pluto372的博客 343

V4L2教程(1):Ubuntu V4L2开发环境搭建与设备探索

欢迎来到V4L2学习指南的第一篇!本文将带你从零开始,在Ubuntu系统上搭建完整的V4L2视频采集开发环境。无论你是想开发视频监控、视频会议还是机器视觉应用,掌握V4L2都是Linux视频开发的必经之路。 **本节学习目标**: - 理解V4L2的基本概念和架构 - 搭建Ubuntu下的V4L2开发环境 - 掌握v4l2-ctl等调试工具的使用 - 学会检测和配置USB摄像头设备

琅嬛福地 417

装饰者设计模式 通俗易懂

精选30+云产品,助力企业轻松上云!>>> 1.1...

兮赫的博客 179

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

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

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

装饰器模式(通俗易懂)

文章目录装饰器模式反例 #1反例 #2反例 #3装饰器模式执行示意图UML类图JDK源码中的装饰器模式展现装饰java.io类UML类图装饰器模式的简单实用 反例都是为了和装饰器模式进行对比,突出其优点,若想直接查看装饰器模式的“真身”,可直接跳到装饰器模式目录 装饰器模式 简述:装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。 业务场景:星巴克卖咖啡,一开始只有4种咖啡 Decaf Es

Alu_em的博客 1164

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

通俗易懂,值得收藏的 java 设计模式实战,装饰者模式 之 你不用改变,就让你的能力变强了

通俗易懂,值得收藏的 java 设计模式实战,装饰者模式 之 你不用改变,就让你的能力变强了

二当家的白帽子 1608

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

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

设计模式之-装饰模式,快速掌握装饰模式,通俗易懂的讲解装饰模式以及它的使用场景

在客户端代码中,首先创建了一个浓缩咖啡对象espresso,然后用Milk装饰了该咖啡对象,再用Sugar装饰了装饰后的咖啡对象。最后,通过调用装饰后的咖啡对象的方法,获取咖啡的费用和描述。CoffeeDecorator是抽象装饰器,实现了咖啡的方法,并包含一个咖啡对象的引用。Milk和Sugar是具体装饰器,分别继承了抽象装饰器,并在其中扩展了咖啡的功能。在现实生活中,装饰模式的例子可以是穿衣服。一个人(原始对象)可以穿不同的衣服(装饰对象)来增加新的功能或美化外观,但人的本质并没有改变。

咖啡程序员 736

这是我见过最通俗易懂的装饰者模式讲解!

托尼斯塔克,漫威著名的超级英雄钢铁侠,也是斯塔克工业的拥有者,还是著名的富豪和花花公子。钢铁侠最出名的就是他的钢铁战衣,而只有穿戴上钢铁战衣的托尼斯塔克才是钢铁侠,通过钢铁战衣让自己成为钢铁侠,做到一些普通人完成不了的事。装饰者模式是23种设计模式中结构型模式的一种,它的核心思想是在不必改变类文件及不使用继承的情况下,通过装饰者包裹目标对象,动态地扩展目标对象的功能。这句话出自漫威的瓦坎达王国,瓦坎达国王也是漫威超级英雄之一,更是一个比钢铁侠更有钱的人,可以说是漫威最富有的超级英雄。

Python专栏 343

装饰设计模式,代理设计模式 最通俗易懂的案例

import java.lang.reflect.Method; import org.springframework.cglib.proxy.Enhancer; import org.springframework.cglib.proxy.MethodInterceptor; import org.springframework.cglib.proxy.MethodProxy; in...

帅成一匹马 376

装饰模式,简单小例子,通俗易懂

装饰模式: package com.fanjia.day20200804; public class Demo09 { public static void main(String[] args) { //装饰模式 //使用环境类被final修饰又要添加功能,可以使用装饰模式 FJStudent fjs = new FJStudent(new UniversityStudent()); fjs.playBasketball(); } } interface People

qq_43472248的博客 173

通俗易懂说java设计模式-装饰器模式

一个装饰器之所以要继承food类,是要保证装饰器通过装饰food而构造的新对象也是一个food。这么做的原因是什么呢?首先从字面理解,装饰是很轻的动作,一个food装饰完当然应该还是food,其次这么做可以方便对food类的多态使用,并且是实现嵌套调用的关键。装饰器从代码层面来看,首先它要继承被装饰对象的抽象类或接口。继承food类后,我们还需要调用原food的方法和属性,才能够加以装饰,构造出装饰后的food方法和属性。这就是为什么我们要把整个被装饰对象传进来,装饰不是无中生有,而是在原先的基础上进行。.

A14997的博客 418

装饰模式(Decorator Pattern)-(最通俗易懂的案例)

前言 我们通常在编码的时候为了扩展一个类的功能往往用的是继承来实现,但是继承的缺点主要是单继承的局限性和可能产生类爆炸的后果。 装饰模式(Decorator),动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。装饰模式属于结构型模式,它是作为现有的类的一个包装。 结构模式图 解析: Component:定义一个对象接口,可以给这些对象动态地添加职责。 Concre...

世银的博客 1万+

通俗易懂,值得收藏的 java 设计模式实战,装饰者模式 之 你不用改变,就让你的能力变强了_java 装饰者模式 实战

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。* 具体装饰(Concrete Decorator)角色。

2401_84139963的博客 841
上一篇: 单例模式之通俗易懂
下一篇: 建造者模式之通俗易懂
沐果果
博客等级 码龄10年 19粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值