Decorator(装饰)--对象结构型模式

Decorator(装饰)–对象结构型模式

一、意图
1.动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。

二、动机
1.在某些情况下我们可能会“过度地使用继承来扩展对象的功能”, 由于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性; 并且随着子类的增多(扩展功能的增多),各种子类的组合(扩展功能的组合)会导致更多子类的膨胀。
2.如何使“对象功能的扩展”能够根据需要来动态地实现?同时避免“扩展功能的增多”带来的子类膨胀问题?从而使得任何“功能 扩展变化”所导致的影响将为最低?

三、适用性
1.在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
2.处理那些可以撤销的职责。
3.打给你不能采用生成子类的方式进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。

四、结构
在这里插入图片描述

五、效果
1.比静态继承更灵活。
2.避免在层次结构高层的类有太多的特征。
3.Decorator与Component不一样。
4.有许多小对象。

六、实现
1.接口的一致性。
2.省略抽象的Decorator类。
3.保持Component类的简单性
4.改变对象外壳(Decorator)与改变对象内核(Strategy)

七、要点总结
1.通过采用组合而非继承的手法,Decorator模式实现了在运行时动态扩展对象功能的能力,而且可以根据需要扩展多个功能。避免了使用继承带来的“灵活性差”和“多子类衍生问题”。
2.Decorator类在接口上表现为is-a Component的继承关系,即 Decorator类继承了Component类所具有的接口。但在实现上又 表现为has-a Component的组合关系,即Decorator类又使用了另外一个Component类。
3.Decorator模式的目的并非解决“多子类衍生的多继承”问题,Decorator模式应用的要点在于解决“主体类在多个方向上的扩展功能”——是为“装饰”的含义。

八、相关模式
Adapter模式:Decorator模式不同于Adapter模式,因为装饰仅改变对象的职责而不该变它的接口;而适配器将给对象一个全新的接口。
Component模式:可以将装饰视为一个退化的、仅有一个组件的组合。然而,装饰仅给对象添加一些额外的职责——它的目的不在于对象聚集。
Strategy模式:用一个装饰你可以改变对象的外表;而Strategy模式使得不可以改变对象的内核。这是改变对象的两种途径。

九、举例说明
装饰模式功能名字很能解释它的行为,比如给手机贴膜,也可以给手机加个外壳,也可以随时换模,添加和减少功能很方便等等。

本文为李建忠设计模式视频的笔记以及《设计模式-可复用面向对象的软件的基础》和自己的部分见解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/308873.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Facade(外观)--对象结构型模式

Facade(外观)–对象结构型模式 一、意图 为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 二、动机 1.上述左边方案的问题在于组件的客户和组件中各种复杂的子系…

.NET Core微服务开发网篇-ocelot

通过上篇我们知道,网关是外部访问的统一入口,本文采用Ocelot作为Api网关。环境要求:vs2019.NetCore3.1Ocelot16.0.1创建一个产品服务Api站点(AAStore.ProductCatalog.Api)添加一个ProductController[Route("api/[…

Flyweight(享元)--对象结构型模式

Flyweight(享元)–对象结构型模式 一、意图 运行共享技术有效地支持大量细粒度的对象。 二、动机 1.在软件系统采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中,从而带来很高的运行时代价——主要指内存需求方面的代价。 2.…

IBM 声明对 Google 违背承诺未将 Istio 贡献给 CNCF 表示失望

Jason R McGee,IBM 院士,IBM 云平台副总裁兼 CTO。昨天晚上Google 宣布将 Istio 商标转让给 Open Usage Commons 组织,IBM 当即在 IBM Developer 网站上发表声明对 Google 的做法表示失望。以下为 IBM 云平台副总裁兼 CTO Jason R McGee 的声…

[mybatis]Configuration XML_properties

properties mybatis可以使用properties来引入外部properties配置文件的内容 resource:引入类路径下的资源 url:引入网络路径或者磁盘路径下的资源 process 项目结构: mybatis-config.xml: <?xml version"1.0" encoding"UTF-8" ?> <!DOCTY…

Proxy(代理)--对象结构型模式

Proxy&#xff08;代理&#xff09;–对象结构型模式 一、意图 为其他对象提供一种代理以控制对这个对象的访问。 二、动机 1.在面向对象系统中&#xff0c;有些对象由于某种原因&#xff08;比如对象创建的开销很大&#xff0c;或者某些操作需要安全控制&#xff0c;或者需要…

浅谈.Net Core DependencyInjection源码探究

前言对于IOC和DI&#xff0c;可能每个人都能说出自己的理解。IOC全称是Inversion of Control翻译成中文叫控制反转&#xff0c;简单的说就是把对象的控制权反转到IOC容器中&#xff0c;由IOC管理其生命周期。DI全称是DependencyInjection翻译成中文叫依赖注入&#xff0c;就是I…

[mybatis]Configuration XML_settings

settings settings包含很多重要的设置项 setting:用来设置每一个设置项name:设置项名value:设置项取值 mapUnderscoreToCamelCase 开启驼峰命名法 <settings><setting name"mapUnderscoreToCamelCase" value"true"/></settings>Emplo…

Chain of responsibility(职责链)--对象行为型模式

Chain of responsibility&#xff08;职责链&#xff09;–对象行为型模式 一、意图 使多个对象有机会处理请求&#xff0c;从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链&#xff0c;并沿着这条链传递该请求&#xff0c;直到有一个对象处理它为止。 二…

[mybatis]Configuration XML_typeAliases and Alias

There are many built-in type aliases for common Java types. They are all case insensitive, note the special handling of primitives due to the overloaded names. typeAliases typeAlias:为某个java类型起别名 type:指定要起别名的类型全类名;默认别名就是类名小写;em…

Command(命令)--对象行为型模式

Command&#xff08;命令&#xff09;–对象行为型模式 一、意图 将一个请求封装为一个对象&#xff0c;从而使你可用不同的请求对客户进行参数化&#xff1b;对请求排队或记录请求日志&#xff0c;以及支持可撤销的操作。 二、动机 1.在软件构建过程中&#xff0c;“行为请求…

实现业务数据的同步迁移 · 思路一

&#xff08;好雨知时节&#xff0c;大雨 _ _ _&#xff09;时不时的呢&#xff0c;会有小伙伴问我这样的问题&#xff1a;1、群主&#xff0c;你的.tsv文件是如何生成的&#xff1f;2、在线项目数据和种子数据的不一样&#xff0c;可以下么&#xff1f;3、如果我本地的数据开发…

Interpreter(解释器)--类行为型模式

Interpreter&#xff08;解释器&#xff09;–类行为型模式 一、意图 给定一个语言&#xff0c;定义它的文法的一种表示&#xff0c;并定义一个解释器&#xff0c;这个解释器使用该表示来解释语言中的句子。 二、动机 1.在软件构建过程中&#xff0c;如果某一特定领域的问题比…

基于.NetCore3.1系列 —— 认证授权方案之授权揭秘 (下篇)

一、前言回顾&#xff1a;基于.NetCore3.1系列 —— 认证授权方案之授权揭秘 (上篇)在上一篇中&#xff0c;主要讲解了授权在配置方面的源码&#xff0c;从添加授权配置开始&#xff0c;我们引入了需要的授权配置选项&#xff0c;而不同的授权要求构建不同的策略方式&#xff0…

Iterator(迭代器)--对象行为模式

Iterator&#xff08;迭代器&#xff09;–对象行为模式 一、意图 提供一种方法顺序访问一个聚合对象的各个元素&#xff0c;而又不需暴露该对象的内部结构。 二、动机 1.在软件构建过程中&#xff0c;集合对象内部结构常常变化各异。但对于这些集合对象&#xff0c;我们希望…

Blazor带我重玩前端(三)

VS自带的Blazor模板介绍需要升级VS2019以及.NET Core到最新版&#xff08;具体的最低支持&#xff0c;我已经忘了&#xff0c;总是越新支持的就越好&#xff09;&#xff0c;以更好的支持自己开发Blazor项目。使用VS创建Blazor WebAssembly项目搜索Blazor模板选择Blazor WebAss…

[mybatis]Configuration XML_environments

enviroments transactionManager There are two TransactionManager types (i.e. type"[JDBC|MANAGED]") that are included with MyBatis: • JDBC – This configuration simply makes use of the JDBC commit and rollback facilities directly. It relies on the…

Mediator(中介者)--对象行为型模式

Mediator&#xff08;中介者&#xff09;–对象行为型模式 一、意图 用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用&#xff0c;从而使其耦合松散&#xff0c;而且可以独立地改变它们之间的交互。 二、动机 1.在软件构建过程中&#xff0c;经常…