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.mzph.cn/news/165121.shtml

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

相关文章

QT 中的元对象系统

作为一名十几年的 C 程序员,最近一段时间使用 QT 开发程序,发现 QT 中还是有许多值得深入理解的技术。QT 不仅仅是一个应用程序开发框架,还有一些对标准 C 的扩充。本文和大家一起探讨 QT 中的元对象系统。 在分析 QT 中的元对象系统之前&…

<JavaEE> 什么是线程(Thread)?进程和线程有什么区别?

目录 一、线程(Thread)的概念 二、线程存在的意义 2.1 并发编程 2.2 比进程更“轻量” 三、使用线程时应该注意 四、进程和线程的区别 五、Java中的线程和操作系统中的线程是不同的概念 六、多线程编程 一、线程(Thread)的…

蓝桥杯官网练习题(奇怪的数列)

题目描述 从 X 星截获一份电码,是一些数字,如下: 13 1113 3113132113 1113122113 ⋯ YY 博士经彻夜研究,发现了规律: 第一行的数字随便是什么,以后每一行都是对上一行"读出来" 比如第 2…

图神经网络的数学原理总结

图深度学习(Graph Deep Learning) 多年来一直在加速发展。许多现实生活问题使GDL成为万能工具:在社交媒体、药物发现、芯片植入、预测、生物信息学等方面都显示出了很大的前景。 本文将流行的图神经网络及其数学细微差别的进行详细的梳理和解释,图深度学…

Linux中flask项目开启https访问

1.下载阿里云免费证书 2.项目添加https配置 3.服务器开启https访问 3.1 重新安装OpenSSL 3.2.重新安装Python 上一次已经讲过Linux安装部署Python: Linux安装Python3.10与部署flask项目实战详细记录,今天记录一下Python项目如何支持https访问…

《计算机中的程序》(灵魂六问)

目录 1、程序是什么? 2、程序是由什么组成的? 3、什么是机器语言? 4、正在运行的程序存储在什么位置? 5、什么是内存地址? 6、计算机的构成元件中,负责程序的解释和运行是哪个? 1、程序是什…

性能相关的闪存特性

一、多Plane操作 上章提到若干个Plane组成Die或者叫LUN,即一个Die上有多个Plane 每次进行写操作时,控制器先将数据写入页缓存中,等同一个Die上另一个Plane也写数据的时候,再同时写入,原来单独操作一个Plane的时间变成了可以同时做…

Springmvc实现增删改差

一、包结构 二、各层代码 (1)数据User public class User {private Integer id;private String userName;private String note;public User() {super();}public User(Integer i, String userName, String note) {super();this.id i;this.userName userName;this.note note;…

Qt实现自定义IP地址输入控件(百分百还原Windows 10网络地址输入框)

在开发网络相关的程序时,我们经常需要输入IP地址,例如源地址和目标地址。Qt提供了一些基础的控件,如QLineEdit,但是它们并不能满足我们对IP地址输入的要求,例如限制输入的格式、自动跳转到下一个输入框、处理回车和退格键等。因此,我们需要自己编写一个自定义的IP地址输入…

AI AIgents时代- Autogen

由微软开发的 Autogen 是一个新的 Agents 项目,刚一上线就登上GitHub热榜,狂揽11k星✨✨✨ 项目地址:https://github.com/microsoft/autogen Autogen 允许你根据需要创建任意数量的Agents,并让它们协同工作以执行任务。它的独特…

外观模式 (Facade Pattern)

定义: 外观模式(Facade Pattern)是一种结构型设计模式,它通过提供一个统一的高层接口来简化复杂子系统或库的访问。这种模式的关键在于,它创建了一个外观类,这个类封装了对子系统的一系列复杂交互&#xf…

【赠书第7期】从零基础到精通Flutter开发

文章目录 前言 1 安装Flutter和Dart 2 了解Flutter的基础概念 2.1 Widget 2.2 MaterialApp和Scaffold 2.3 Hot Reload 3 编写你的第一个Flutter应用 3.1 创建一个Flutter项目 3.2 修改默认页面 3.3 添加交互 4 深入学习Flutter高级特性 4.1 路由和导航 4.2 状态管…

python之TCP的网络应用程序开发

文章目录 版权声明python3编码转换socket类的使用创建Socket对象Socket对象常用方法和参数使用示例服务器端代码客户端代码 TCP客户端程序开发流程TCP服务端程序开发流程TCP网络应用程序注意点socket之send和recv原理剖析send原理剖析recv原理剖析send和recv原理剖析图 多任务版…

浅谈C#在unity应用中的工厂模式

文章目录 前言简单工厂模式工厂方法模式抽象工厂模式Unity实战 前言 工厂模式是一种创建型设计模式,它提供了一种将对象的实例化过程封装起来的方法,使得客户端代码不必直接依赖于具体类。这有助于降低代码的耦合度,提高代码的可维护性和可扩…

Python项目打包

Python项目如何打包? 本指南总结了Python项目打包的最佳实践,主要涉及代码的打包和分发,以及环境和依赖的管理。 0. 一般项目清单 源代码(可使用git托管)数据包(可使用DVC托管)Docker环境镜像…

Python进行threading多线程编程及高级并发处理机制

threading 模块是 Python 中用于进行多线程编程的标准库之一。通过 threading 模块,你可以创建和管理线程,使得程序能够并发执行多个任务。以下是一些基本的 threading 模块的用法: 1. 创建线程: 使用 threading.Thread 类可以创…

在两个java项目中实现Redis的发布订阅模式

如何在两个java项目中实现Redis的发布订阅模式? 1. Redis简介2. 发布订阅模式介绍3. 实现思路4. 代码实现及详细解释4.1. RedisUtil4.2. Publisher4.3. Subscriber4.4. 运行程序 目录: Redis简介发布订阅模式介绍实现思路代码实现及详细解释 1. Redis简…

HTB Napper WriteUp

Napper 2023年11月12日 14:58:35User Nmap ➜ Napper nmap -sCV -A -p- 10.10.11.240 --min-rate 10000 Starting Nmap 7.80 ( https://nmap.org ) at 2023-11-12 13:58 CST Nmap scan report for app.napper.htb (10.10.11.240) Host is up (0.15s latency). Not shown: …

gitee推荐-SAPI++

一下内容来自gitee。 SaaS-Apps-Engine: 智者|SAPI是多应用、多租户SaaS应用引擎,支持(小程序/公众号/轻应用/企微/抖音/支付宝/百度)等多平台应用。基于ThinkPHP6.1/8.0原生多应用模式开发,简洁、高效、易扩展。集成强大的权限控…

适用于电脑的5个免费文件恢复软件分享

适用于电脑的最佳免费文件恢复软件 任何计算机用户都可能经历过丢失重要文件的恐惧。重要数据的丢失可能会令人不安和沮丧,无论是由于不小心删除、计算机故障还是硬盘格式化造成的。幸运的是,在数字时代,您可以使用值得信赖的解决方案检索这些…