设计模式之装饰者模式

news2024/11/24 22:58:15

装饰者模式

定义

先上定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式。

优缺点

优点:
1,装饰器是继承的有力补充,比继承灵活,在不改变原有对象的情况下,动态的给一个对象扩展功能,即插即用
2,通过使用不用装饰类及这些装饰类的排列组合,可以实现不同效果
3,装饰器模式完全遵守开闭原则

缺点:
装饰模式会增加许多子类,过度使用会增加程序得复杂性,维护起来比较困难

使用场景

用户在不知道内部构建细节的情况下,可以精细的控制对象的构造流程。
当需要通过对现有的一组基本功能进行排列组合而产生非常多的功能时采用继承关系很难实现,而采用装饰模式却很好实现。

解构

装饰者模式的结构和使用:

  • 抽象构件(Component)角色:它是具体构件和抽象装饰类的共同父类,声明了在具体构件中实现的业务方法,它的引入可以使客户端以一致的方式处理未被装饰的对象以及装饰之后的对象,实现客户端的透明操作。
  • 具体构件(ContextImpl)角色:它是抽象构件类的子类,用于定义具体的构件对象,实现了在抽象构件中声明的方法,装饰器可以给它增加额外的职责(方法)。
  • 抽象装饰(Decorator)角色:它也是抽象构件类的子类,抽象装饰类不一定是抽象方法。用于给具体构件增加职责,但是具体职责在其子类中实现。它维护一个指向抽象构件对象的引用,通过该引用可以调用装饰之前构件对象的方法,并通过其子类扩展该方法,以达到装饰的目的。
  • 具体装饰(ConcreteDecorator)角色:它是抽象装饰类的子类,负责向构件添加新的职责。每一个具体装饰类都定义了一些新的行为,它可以调用在抽象装饰类中定义的方法,并可以增加新的方法用以扩充对象的行为。

上图:
在这里插入图片描述

举例说明

talk is cheap,show me the code;
上代码:
现在小伙伴都喜欢喝奶茶,那么就用奶茶举个例子,奶茶有很多口味,比如红豆,椰果,我的最爱芒果等;

奶茶抽象类:

public abstract class AbstractMilkyTea {
    public abstract String getContent();
    public abstract double getPrice();
}

基础的奶茶类:

public class BaseMilkyTea extends AbstractMilkyTea{

    @Override
    public String getContent() {
        return "MilkyTea";
    }

    @Override
    public double getPrice() {
        return 10.00;
    }
}

抽象装饰类:

public abstract class AbstractDecorator extends AbstractMilkyTea {
    private AbstractMilkyTea baseMilkyTea;
    public AbstractDecorator(AbstractMilkyTea baseMilkyTea) {
        this.baseMilkyTea = baseMilkyTea;
    }

    @Override
    public String getContent() {
        return baseMilkyTea.getContent();
    }

    @Override
    public double getPrice() {
        return baseMilkyTea.getPrice();
    }

}

红豆奶茶类:

public class ReadBeanDecorator extends AbstractDecorator{
    public ReadBeanDecorator(AbstractMilkyTea baseMilkyTea) {
        super(baseMilkyTea);
    }

    @Override
    public String getContent() {
        return super.getContent()+"read bean";
    }

    @Override
    public double getPrice() {
        return super.getPrice()+2;
    }
}

椰果奶茶类:

public class CoconutDecorator extends AbstractDecorator{
    public CoconutDecorator(AbstractMilkyTea baseMilkyTea) {
        super(baseMilkyTea);
    }

    @Override
    public String getContent() {
        return super.getContent()+"coconut";
    }

    @Override
    public double getPrice() {
        return super.getPrice()+3;
    }
}

芒果奶茶类:

public class MangoDecorator extends AbstractDecorator{
    public MangoDecorator(AbstractMilkyTea baseMilkyTea) {
        super(baseMilkyTea);
    }

    @Override
    public String getContent() {
        return super.getContent()+"Mango";
    }

    @Override
    public double getPrice() {
        return super.getPrice()+5;
    }
}

测试代码:

        baseMilkyTea = new MangoDecorator(baseMilkyTea);
        System.out.println(baseMilkyTea.getPrice());
        System.out.println(baseMilkyTea.getContent());

Android Context举例分析

接下来我们通过Android 中的Context的类图,来了解下装饰者模式,对Android开发者应该更直观一些。
在架构设计时,应多用组合,少用继承,同时对扩展开放,对修改关闭;
上个简单的图:
在这里插入图片描述
Context就是抽象构件,ContextImpl作为具体构件,ContextWrapper是抽象装饰类,Service,Application就是具体装饰类;

在startActivity时候,会调用系统的handleLaunchActivity方法,接着调用performLaunchActivity方法。其中会创建一个ContextImpl. 然后activity.attach(ContextImpl)将ContextImpl赋予ContextWrapper的mBase。ContextWrapper中的所有行为全都通过mBase去实现。同时ContextWrapper通过具体的子类扩展方法不同的行为,实现对context的装饰和功能扩展。这里就不具体的展开了。

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

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

相关文章

【进阶C语言】文件操作

文章目录一.文件1.文件的功能2.文件的分类3.文件路径绝对路径相对路径4.文件信息区5.文件缓冲区6.流的概念7.输入输出二.文件函数1.打开与关闭文件打开文件——fopen返回类型参数关闭文件——fclose返回类型参数2. 顺序读写1.输入输出字符输入字符函数——fgetc返回类型函数参数…

新享科技UniPro将敏捷理念数字化 助力企业迎接2023

2023年新年伊始,“复苏”和“希望”成了越来越多国内企业和消费者的直接感受,与此同时,国际经济也从疫情中缓慢“恢复”过来,特斯拉在中国区掀起了新一轮降价风潮,而行业“销冠”比亚迪却高调发布了百万级新车。如同晴…

websocket显示实时消息

websocket实现实时消息展示 前面介绍过websocket聊天功能的实现,不清楚的可以先看下 websocket实现在线聊天 https://blog.csdn.net/qq_51076413/article/details/124644500 之前发过websocket的相关使用和一对一聊天的demo代码,这里是针对上几篇文章的补充&#x…

Nacos服务注册与发现源码剖析

文章目录前提介绍Nacos源码下载Nacos客户端源码Spring Cloud Starter Nacos 源码Nacos服务端源码前提介绍 服务注册与发现作用主要是为了更好的管理众多的服务,不论Nacos还是Zookeeper、Eureka,作为注册中心都是为了解决以下两个问题: 屏蔽…

【论文写作】英文写作工具推荐及使用教程:DeepL(翻译) + EasyEssay(扩写) + QuillBot(改写润色)

文章目录一、DeepL二、EasyEssay2.1 润写2.2 扩写2.3 生成文章2.4 英文查重三、QuillBot一、DeepL DeepL官网 DeepL的主要作用是翻译,一开始我也是在B站上看到有人推荐用这款翻译工具的,抱着试一试的心态去用了一下,感觉翻译效果真的很不错&a…

【贪心】AcWing 803. 区间选点

905. 区间选点 文章目录题目描述输入格式:输出格式:数据范围输入样例输出样例方法:贪心解题思路代码复杂度分析:题目描述 给定 N 个闭区间 [ai,bi][a_i,b_i][ai​,bi​],请你在数轴上选择尽量少的点,使得每…

利用时间序列预测电量,冷量和压缩空气量

利用时间序列预测电量,冷量和压缩空气量背景分析与思路代码结果一,电量预测二,冷量预测三,压缩空气预测调优一,电量预测(m6)二,冷量预测三,压缩空气预测背景 根据提供的数据,详见附…

企业开发项目【1】— — 流程、开发环境搭建模板

企业开发项目【1】— — 流程、开发环境搭建模板 以黑马的学成在线为例 1 项目背景 2 项目介绍 3 开发环境搭建 3.1 开发工具配置(后端) 3.1.1 Idea配置 环境编码 编译级别配置 project structure - 设置JDK版本和编译级别3. 自动导包设置 IDEA可以…

远距离车载高速网络通讯方案

一 车载网络的发展 随着电子、半导体和通讯等行业的快速发展,汽车智能化的诉求也愈发强烈。越来越多的传感器和处理器的应用推动了汽车的智能化和电气化,与此同时,也使得ECU(电子控制单元)的数量快速增加。随着自动驾…

基于“python+”潮汐、风驱动循环、风暴潮等海洋水动力模拟

ADCIRC是新一代海洋水动力计算模型,它采用了非结构三角形网格广义波动连续方程的设计,在提高计算精确度的同时还减小了计算时间。被广泛应用于:模拟潮汐和风驱动的循环、预测风暴潮和洪水和近岸海上作业等。 除此之外,ADCIRC也是我…

目前市场上比较好的oa办公系统企业管理软件有哪些?

行政小李拿着《疫情期间春节返乡填报单》在工位之间来回穿梭…… 财务小王把年终奖金和福利方法拿给老板签字…… 行政小李的和人事小赵回回都因为入职新人培训的事情扯皮…… 后勤小郑每次办公物资的整理都要做半天…… OA系统本就是为企业内部的员工沟通、工作效率提高、协作…

WebDAV之葫芦儿·派盘+BookxNote

BookxNote 支持WebDAV方式连接葫芦儿派盘。 BookxNote是全新设计的电子书阅读学习笔记软件,以不同的思维方式重塑我们的学习过程。一边阅读一边划重点,提供多种划重点笔记工具,包括直线、矩形、圆形、高亮文本,图片摘录。高亮的文本自动编辑为重点的批注内容,还可以对重点…

查看网站历史记录的2种办法,怎样查看网站历史记录?

有个想购买二手域名的朋友问小黑:如何查看网站历史记录?于是今天就分享查看网站历史记录的 2种办法:网站历史记录和快照。 如果你在下单之前想查一查域名以前做过些什么,有没有违禁记录,被惩罚过,被K过等等…

LeetCode082_82. 删除排序链表中的重复元素 II

LeetCode082_82. 删除排序链表中的重复元素 II 一、描述 给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。 示例 1: 输入:head [1,2,3,3,4,4,5] 输出:…

CODESYS开发教程8-定时、触发和计数

今天继续我们的小白教程,老鸟就不要在这浪费时间了😊。 前面一期我们介绍了CODESYS的字符串及其操作。这一期主要介绍CODESYS的定时器及触发的相关功能块特性及用法,注意本文介绍的定时器、触发器和计数器均包含在CODESYS的Standard库中。 一…

c-note:字符串常量初始化存放位置

两行代码,分别以数组形式和指针形式,先说结论。 对于字面量"he"的存放位置: 1、数组形式,字面量直接存放进栈给temp处开辟的空间 2、指针形式,字面量"he"是一个常量,在编译之初便存在于…

如何在mac上使用idea做大数据开发

1 软件包下载jdk1.8 (jdk1.8.0_231)idea(包括2018,2019) (ideaIC-2019.3.3/ideaIC-2018.3.5)汉化包:汉化包.rarmaven3.6.3 (apache-maven-3.6)2 jdk的安装第一:把包直接放到自定义目录下第二:配置环境变量a) 打开终端 输入 sudo vi /etc/profile 或者 sudo vi .bash_profile解释…

联合证券|滴滴出行即日起恢复!A股嗨了!券商扛起领涨大旗

A股今天全线走高,沪指涨超1%克复3200点,深成指、创业板指盘中涨超2%;港股午后回落走低,恒生科技指数一度跌超2%。 详细来看,A股方面,两市股指盘中强势拉升,沪指涨超1%站稳3200点,深成…

『速查手册』MIME 多用途互联网邮件扩展

『速查手册』MIME 多用途互联网邮件扩展 文章目录『速查手册』MIME 多用途互联网邮件扩展一、多用途互联网邮件扩展 / 互联网媒体类型二、MIME 命名规则😎三、MIME 类型列表🍉1)、Type 类型形式2)、Application 应用文件3)、Text 文本4)、Video 视频文件…

elasticsearch(三)-- 理解ES的索引操作

一、前言 上一章我们主要学习了es的几个客户端,那么我们后面也主要通过kibana客户端、HighLevelClient高级客户端这两个来学习es. 这一章的学习我们主要是学习一些Elasticsearch的基础操作,主要是深入一些概念,比如索引的具体操作&#xff0…