设计模式之(7)——装饰设计模式

定义:装饰设计模式允许向一个现有的对象添加功能,而不改变其结构(这就很符合程序设计的” 开闭原则“),重点突出类功能的增强,属于结构型创建模式,这种模式创建了一个装饰类,用来包装原有类,保持类方法签名完整的情况下,提供了额外的功能。

意图:动态地给一个对象增加一些额外的职责,装饰是比子类更为灵活和优秀的一种方案;

主要解决:通常扩展一个类我们通常使用继承实现,由于继承为类引入特征,通常随着功能的扩展,子类会很膨胀,容易造成类爆炸;装饰设计模式是一种使用组合替代继承的最佳实现,《effective java》中也建议” 组合优先于继承“,面向对象编程有封装、继承和多态三大特征,其中封装和继承却有一点矛盾,继承意味着子类 依赖了父类的实现,一旦父类中改变了规则,会对子类造成影响,这是打破封装的一种表现,而组合就是巧用封装来实现继承功能的代码复用;

何时使用:在不想增加很多子类的情况下扩展类的功能;

设计模式结构图:

模式角色分析:

1、抽象构件角色(Component):定义一个抽象接口,用来规范被装饰类的行为;

2、具体构件角色(ConcreteComponent):需要被装饰的目标对象;

3、抽象装饰角色(decorator):持有一个具体构件对象的实例,并定义一个与抽象构建接口一致的接口;

4、具体装饰角色(ConcreteDecorator):具体的装饰类,负责给被装饰者扩展功能;

优点:

1、装饰和继承都能达到扩展类功能的目的,但是装饰模式更加灵活;

2、装饰设计模式有很好的可扩展性;

3、通过使用不同的具体装饰类,以及这些类的排列组合,可以实现多重装饰;

缺点:

装饰设计或是会导致程序设计中出现许多小对象,如果过度使用会使程序变得更加复杂;

UML类图:

测试代码:

Original: https://www.cnblogs.com/wha6239/p/16646861.html
Author: 一只烤鸭朝北走
Title: 设计模式之(7)——装饰设计模式

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/612888/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 分享封装好的异步Mysql动态的库(DyNetMysql.dll) + 项目源码

    在做C++项目时,经常会用到Mysql数据库,Mysql接口提供给我们的数据是相当原始的,如:字段名、字段类型,字段长度等等,一般情况我们都想一种更方便获得数据 如: XXXStr…

    数据库 2023年6月14日
    091
  • 深入浅出分析 PriorityQueue

    作者:炸鸡可乐原文出处:www.pzblog.cn 一、摘要 在前几篇文章中,咱们了解到,Queue 的实现类有 ArrayDeque、LinkedList、PriorityQue…

    数据库 2023年6月14日
    0103
  • Spring(一)-初识 + DI+scope

    1、获取bean实例的三种方式 UTF-8 4.3.18.RELEASE 1.16.18 4.11 org.springframework spring-beans ${sprin…

    数据库 2023年6月16日
    093
  • 数据专家最常使用的 10 大类 Pandas 函数 ⛵

    💡 作者:韩信子@ShowMeAI📘 数据分析实战系列:http://www.showmeai.tech/tutorials/40📘 本文地址:http://www.showmea…

    数据库 2023年6月14日
    095
  • 3. 视图-触发器-存储过程-索引

    404. 抱歉,您访问的资源不存在。 可能是URL不正确,或者对应的内容已经被删除,或者处于隐私状态。 [En] It may be that the URL is incorre…

    数据库 2023年5月24日
    098
  • 多商户商城系统功能拆解29讲-平台端营销-会员签到

    多商户商城系统,也称为B2B2C(BBC)平台电商模式多商家商城系统。可以快速帮助企业搭建类似拼多多/京东/天猫/淘宝的综合商城。 多商户商城系统支持商家入驻加盟,同时满足平台自营…

    数据库 2023年6月14日
    0117
  • Redis学习

    Redis 因为没有指定配置文件 需配置 redis-server redis.windows.conf 之后自动启动 测试性能 redis-benchmark -p 6379 -…

    数据库 2023年6月16日
    088
  • 2022CNAS能力验证-存在性

    背景 警方接到报案称有人利用无人机投放非法宣传材料,根据线索找到一处住宅,搜查发现无人机、智能电视机、小型网络设备等电子设备,提取了电子设备数据并对网络设备进行了抓包分析。现委托你…

    数据库 2023年6月11日
    078
  • Java 线程创建与常用方法

    进程与线程 进程 程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、…

    数据库 2023年6月16日
    085
  • 多版本并发控制 MVCC

    介绍多版本并发控制 多版本并发控制技术(Multiversion Concurrency Control,MVCC) 技术是为了解决问题而生的,通过 MVCC 我们可以解决以下几个…

    数据库 2023年6月11日
    0144
  • Linux日志管理

    日志管理 日志文件 日志文件是重要的系统信息文件,其中记录了许多重要的系统事件,包括用户的登录信息、系统的启动信息、系统的安全信息、邮件相关信息、各种服务相关信息等。日志对于安全来…

    数据库 2023年6月16日
    098
  • SQL Archery 代码说明及优化(一)

    1.字段加密–django-mirage-field 一个django模型字段,在保存到数据库时对数据进行加密,在从数据库获取数据时进行解密。它使数据库中的数据始终加密…

    数据库 2023年6月16日
    0110
  • python-去除txt文件空格、特殊字符

    #!/usr/bin/python -*- coding: UTF-8 -*- """ @author: Roc-xb ""&qu…

    数据库 2023年6月14日
    095
  • Mysql异常——com.alibaba.druid.sql.parser.ParserException

    今天写业务逻辑时候,写完发现控制台出现报错,但是程序可以正常运行。在控制台报错中发现是因为SQL模糊查询格式问题 修改模糊查询 写法后 成功解决该报错 Original: http…

    数据库 2023年6月16日
    0202
  • SQL Server 2022来了

    SQL Server 2022来了 微软SQL Server依然保持着3年内发布一个大版本的传统,最新版本已经来到SQL Server2022 相关特性双向HA/DR 到Azure…

    数据库 2023年6月9日
    0118
  • 凤凰架构: 构建可靠的大型分布式系统

    推荐一本好书: 《凤凰架构: 构建可靠的大型分布式系统》–作者:周志明 这是一本开源书,同时也已经出版。有着纸质书、电子书、开源网站文档和Github文档。文末已附上链…

    数据库 2023年6月6日
    0118
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球