Android设计模式--装饰模式

   千淘万漉虽辛苦,吹尽黄沙始到金

一,定义

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

装饰模式也叫包装模式,结构型设计模式之一,其使用一种对客户端透明的方式来动态地扩展对象的功能,同时它也是继承关系的一种替代方案之一。

二,使用场景

需要透明且动态的扩展类的功能时。

装饰模式在代码中的应用非常广泛,我们在不经意间就会使用到类似的概念。比如:

public abstract class EtnApplication extends Application {@Overridepublic void onCreate() {super.onCreate();setRxJavaErrorHandler();initApplication();}private void initApplication(){}private void setRxJavaErrorHandler(){}
}

这里的setRxJavaErrorHandler 和initApplication 就是对onCreate方法的包装

三,角色介绍

1,Component:抽象组件

可以是一个接口或者抽象类,其充当的就是被装饰的原始对象

2,ConcreteComponent:组件具体实现类

该类是Component类的基本实现,也是我们装饰的具体对象

3,Decorator:抽象装饰者

其承担的职责就是为了装饰我们的组件对象,其内部一定要有一个指向组件对象的引用。在大多数情况下,该类为抽象类,需要根据不同的装饰逻辑实现不同的具体子类。当然,如果装饰逻辑单一,只有一个的情况下我们可以省略该类直接作为具体的装饰者

4,ConcreteDecorator:装饰者具体实现类

只是对抽象装饰者作出具体的实现

四,使用案例

在和平精英吃鸡手游这个游戏的玩家群体里,大部分人玩游戏都是自己一个人玩,有一部分人为了上分会花钱请一些技术陪玩一起玩,还有一部分人玩游戏不是为了上分,而是为了开心,他们会花钱请一些娱乐陪玩一起玩。

在这里,我们就可以将玩家定义为一个抽象类,将玩家玩游戏的行为定义为一个具体的方法,这就是上面提到的抽象组件:

public abstract class Player {/*** 玩游戏* */public abstract void playGame();
}

然后具体实现类就是具体到某个人,继承抽象组件:

public class YuanZhen extends Player{@Overridepublic void playGame() {System.out.println("玩吃鸡游戏");}
}

然后创建一个抽象的装饰者类:

public abstract class PlayerAbsDecorator extends Player{protected Player player;public PlayerAbsDecorator(Player player) {this.player = player;}@Overridepublic void playGame() {player.playGame();}
}

这个类是该模式的核心类,它持有了Player的引用,可以方便的调用具体被装饰对象中的方法,这也是为什么我们可以在不破坏原类层次结构的情况下为类增加一些功能,我们只需在被装饰对象的相应方法的前或后增加相应的功能逻辑即可。

最后创建我们的具体装饰者类,继承抽象装饰者类,实现技术陪玩和娱乐陪玩相关方法

public class TechnicalPlayer extends PlayerAbsDecorator{public TechnicalPlayer(Player player) {super(player);}public void eatChicken(){System.out.println("吃鸡了");}@Overridepublic void playGame() {super.playGame();eatChicken();}
}
public class EntertainmentPlayer extends PlayerAbsDecorator{public EntertainmentPlayer(Player player) {super(player);}private void happy(){System.out.println("玩的开心");}@Overridepublic void playGame() {super.playGame();happy();}
}

使用:

YuanZhen yuanzhen=new YuanZhen();
EntertainmentPlayer entertainmentPlayer =new EntertainmentPlayer(yuanzhen);
entertainmentPlayer.playGame();
TechnicalPlayer technicalPlayer =new TechnicalPlayer(yuanzhen);
technicalPlayer.playGame();

输出:

这样就实现了一个简单的装饰者模式。

五,总结

装饰者模式和代理模式Java 代理模式之静态代理与动态代理_java静态代理模式_袁震的博客-CSDN博客有点类似,有时容易混淆。

注意:装饰模式是以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案,而代理模式则是给一个对象提供一个代理对象,并有代理对象来控制原有对象的引用。装饰模式应该为所装饰的对象增强功能,代理模式对代理的对象施加控制,但不对对象本身的功能进行增强。

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

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

相关文章

C语言之字符串函数

C语言之字符串函数 文章目录 C语言之字符串函数1. strlen的使用和模拟实现1.1 strlen的使用1.2 strlen的模拟实现 2. strcpy的使用和模拟实现2.1 strcpy的使用2.2 strncpy的使用2.3 strcpy的模拟实现 3. strcat的使用和模拟实现3.1 strcat的使用3.2 strncat3.3 strcat的模拟实现…

Blender烘焙AO操作及对应的python代码

(一)Blender软件操作 1. 导入模型(这里省略) 2. 材质设置 模型使用的所有材质都需要删除Surface Shader,没有其他多余的计算,可以大量缩短烘焙时间。删除之后的只留下一个材质输出节点,如图所…

深信服防火墙路由模式开局部署-手把手教学(小白篇)

PS:深信服的设备只有400能够通过console连接,一般用户是无法连接的,所以大家不要妄想着从Console连接设备了,开局就通过MANAGE进入Web就可以 接通电源后,开机拿一根网线,一端连接防火墙的MANAGE口&#xf…

一致性 Hash 算法 Hash 环发生偏移怎么解决

本篇是对文章《一文彻底读懂一致性哈希算法》的重写,图文并茂,篇幅较长,欢迎阅读完提供宝贵的建议,一起提升文章质量。如果感觉不错不要忘记点赞、关注、转发哦。原文链接: 《一文彻底读懂一致性Hash 算法》 通过阅读本…

土地利用数据技术服务

一、背景介绍 土地是人类赖以生存与发展的重要资源和物质保障,在“人口-资源-环境-发展(PRED)”复合系统 中,土地资源处于基础地位。随着现代社会人口的不断增长以及工业化、城市化进程的加速&a…

【硬核HeyGen平替】在window平台上使用MyHeyGen

最近在研究HeyGen的平替开源项目,然后发现了MyHeyGen这个项目,但是文档上面并没有说明如果在window平台上使用,考虑到非window平台安装显卡驱动什么的比较繁琐,所以尝试硬着头皮干... 前提 开源项目中所需的环境准备要先准备好 1…

C语言——文件操作

归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍 收藏⭐ 留言​📝 我辈皆凡人,用一生铺就的…

flink和机器学习模型的常用组合方式

背景 flink是一个低延迟高吞吐的系统,每秒处理的数据量高达数百万,而机器模型一般比较笨重,虽然功能强大,但是qps一般都比较低,日常工作中,我们一般是如何把flink和机器学习模型组合起来一起使用呢? fli…

iframe内部子页面与外部主页面通讯

文章目录 一、问题二、解决2.1、子页面2.2、主页面 三、知识点3.1、[浏览器兼容性](https://developer.mozilla.org/zh-CN/docs/Web/API/Window/postMessage#%E6%B5%8F%E8%A7%88%E5%99%A8%E5%85%BC%E5%AE%B9%E6%80%A7)3.2、详解3.2.1、发送方3.2.2、接收方 一、问题 如上所示&a…

STM32 中断系统

单片机学习 目录 文章目录 前言 一、中断系统 1.1 什么是中断 1.2 中断优先级 1.3 中断嵌套 1.4 C语言中的中断程序 二、STM32的中断通道和中断向量 2.1 中断通道 2.2 嵌套向量中断控制器NVIC 2.2.1 什么是NVIC 2.2.2 NVIC基本结构 2.2.3抢占优先级和响应优先级 2.2.4 NVIC的优…

基于C#实现线段树

一、线段树 线段树又称"区间树”,在每个节点上保存一个区间,当然区间的划分采用折半的思想,叶子节点只保存一个值,也叫单元节点,所以最终的构造就是一个平衡的二叉树,拥有 CURD 的 O(lgN)的时间。 从…

【miniQMT实盘量化5】获取财务报表数据

前言 上面文章,我们介绍了如何获取实时数据,这篇文章,我们继续往下探讨,介绍关于财务报表数据的获取。 财务报表数据 财务报表数据,也就是常说的基本面数据,是除了行情数据之外,辅助我们投资…