设计模式7:装饰者模式

news2024/12/29 10:25:08

目录

    • 装饰者模式是要解决什么问题?
    • 装饰者模式在JDK中有哪些实际应用?
    • 装饰者模式在Android SDK中有哪些实际应用?
    • 装饰者模式和适配器模式的区别是什么?
    • 装饰者模式和代理模式的区别是什么?

装饰者模式是要解决什么问题?

官方说法:装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。

个人理解:原始接口功能不足,需要添加新方法,但是别的地方已经实现了原始接口,所以原始接口又不能直接添加方法。这时候可以采用持有原始类对象,并且添加新方法的方式,实现新功能。并且继承原始类或者实现原始接口,达到可替换原始类的目的。

装饰者模式在JDK中有哪些实际应用?

FilterInputStream
InputStream是一个抽象类,源码:

public abstract class InputStream implements Closeable {
    ...
    public abstract int read() throws IOException;    
    ...
}

InputFilterStream源码:

public
class FilterInputStream extends InputStream {

    protected volatile InputStream in;
    ...

    public int read() throws IOException {
        return in.read();
    }
	...
}

BufferedInputStream源码:

public
class BufferedInputStream extends FilterInputStream {

    public BufferedInputStream(InputStream in) {
        this(in, DEFAULT_BUFFER_SIZE);
    }
    
    public BufferedInputStream(InputStream in, int size) {
        super(in); //注意这里调用了FilterInputStream的构造器
        if (size <= 0) {
            throw new IllegalArgumentException("Buffer size <= 0");
        }
        buf = new byte[size];
    }

    public synchronized int read() throws IOException {
        if (pos >= count) {
            fill();
            if (pos >= count)
                return -1;
        }
        return getBufIfOpen()[pos++] & 0xff;
    }

	...

    private InputStream getInIfOpen() throws IOException {
        InputStream input = in;
        if (input == null)
            throw new IOException("Stream closed");
        return input;
    }

	...
	
}

三个类完整的方法:
InputStream是抽象类,且只有一个抽象方法。

FilterInputStream并没有增加方法,只是持有了InputStream的实例。

BufferedInputStream增加了几个方法,例如:getInIfOpen()

使用BufferedInputStream:

BufferedInputStream bis = new BufferedInputStream(new FileInputStream(new File("/home/user/abc.txt")));

Java IO 中的流与设计模式

装饰者模式在Android SDK中有哪些实际应用?

  • ContextWrapper与Application、Activity。具体参考:设计模式(十一)Context中的装饰者模式
    网上有些博客讲用装饰者模式给RecyclerView添加Header。例如:装饰者设计模式-RecyclerView添加头部和底部 ,我没有仔细分析,不下结论。

装饰者模式和适配器模式的区别是什么?

简单讲:装饰者模式解决的是原始类功能不足的问题。适配器模式解决的是原始类有这个功能,但是功能不匹配的问题。
例如原始类有裤子,但是没有鞋子,这个时候用装饰器模式。原始类有鞋子,但是鞋码大了,不合适,这个时候用适配器模式。

装饰者模式:

  • 装饰者模式(Decorator Pattern)目的是为原始类对象动态地添加新功能。解决原始类功能不足的问题。
  • 装饰者类起功能增强作用。
  • 继承原有类,创建一个装饰器类,将原始类对象包装在装饰器中,以组合的方式来添加功能。

适配器模式:

  • 适配器模式(Adapter Pattern)目的是为了实现目标接口,解决原始类功能不匹配的问题。使目标接口和原始类进行交互。
  • 适配器类起一个桥梁的作用。
  • 适配器模式通过创建一个适配器类,配合原始类的方法,实现目标接口的方法。

装饰者模式和代理模式的区别是什么?

  • 目的不同:装饰者模式是为了扩展原有对象的功能,在装饰者中添加新的方法。代理模式是为了控制原有对象的访问,在原有对象的方法上做了修改。
  • 方法数量不同:装饰者模式中,装饰者的方法数量比被装饰者多,因为要添加新的方法。代理模式一般情况下方法数量和父类相同。
  • 原有对象访问修饰符不同:装饰者模式中,原有对象的访问修饰符一般是protected

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

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

相关文章

基于matlab使用单类全卷积数据描述异常检测网络检测药丸图像上的缺陷(附源码)

一、前言 此示例演示如何使用单类全卷积数据描述 &#xff08;FCDD&#xff09; 异常检测网络检测药丸图像上的缺陷。 异常检测的一个关键目标是让人类观察者能够理解为什么经过训练的网络将图像分类为异常。FCDD支持e可解释的分类&#xff0c;它用证明神经网络如何达到其分类…

Python快速将多个文件夹内的文件移动至一个文件夹内

在日常办公中生活中&#xff0c;我们经常需要将多个文件夹内的文件如&#xff1a;(图片png,jpg,jpeg&#xff0c;word文档&#xff0c;Excel,PPT等等)&#xff0c;需要将这个文件夹内的文件移动至同一个文件夹内&#xff0c;如果我们复制粘贴的话&#xff0c;将会非常的繁琐以及…

Impala3.4源码阅读笔记(七)解析ScanNode(上)

前言 本文为笔者个人阅读Apache Impala源码时的笔记&#xff0c;仅代表我个人对代码的理解&#xff0c;个人水平有限&#xff0c;文章可能存在理解错误、遗漏或者过时之处。如果有任何错误或者有更好的见解&#xff0c;欢迎指正。 正文 我们知道Impala执行一条SQL的主要流程…

在vscode中配置git bash终端

将以下配置添加到vscode中的settings.json中 "terminal.integrated.profiles.windows": {"PowerShell": {"source": "PowerShell","icon": "terminal-powershell"},"Command Prompt": {"path"…

【C++】类和对象(中篇)----->六大默认成员函数

目录 一、类的6个默认成员函数 二、构造函数 1、概念 2、特性 三、析构函数 1、概念 2、特性 四、拷贝构造函数 1、概念 2、特征 五、赋值运算符重载 1、运算符重载 2、值运算符重载 2.1 赋值运算符重载格式 2.2 赋值运算符只能重载成类的成员函数不能重载成全局函数 2.3…

使用postman发请求报错Error: connect ECONNREFUSED 127.0.0.1:33210

原因&#xff1a;代理服务器问题 解决&#xff1a; 两种方案任选其一 1.电脑网络设置&#xff0c;关闭代理服务器 2.postman 的设置proxy 取消勾选

Mac中VSCode配置vue项目环境

一、下载VSCode 进入VSCode官网&#xff0c;下载Mac版安装包 设置中文: vscode导航栏view -> Command Palette -> 输入Configure Display Language -> 选择简体中文 -> 重启 二、下载node.js 下载地址&#xff1a;node.js官网&#xff0c;建议下载长期维护版本…

交叉编译paho带SSL

1.新建文件夹 /home/yiweijiao/woke_lab/paho 2.解压paho.mqtt.c到/home/yiweijiao/woke_lab/paho/paho.mqtt.c 3.新建文件夹/home/yiweijiao/woke_lab/paho/openssl_lib 将已经交叉编译好的openssl复制到这里 4.cd /home/yiweijiao/woke_lab/paho/paho.mqtt.c 新建文件夹…

hive和datax數據採集數量對不上

hive和datax數據採集數量對不上 對數據的時候發現有些對不上&#xff0c;在hive中 staff_id DF67B3FC-02DD-4142-807A-DF4A75A4A22E’的數據只有1033 而在mysql中發現staff_id DF67B3FC-02DD-4142-807A-DF4A75A4A22E’的數據有4783條記錄&#xff08;昨天的記錄是4781&#…

控制哈威比例多路阀放大板

控制各种不带电气位移反馈的HAWE哈威多路比例阀PSV系列、PSVF系列等比例电磁铁。 比例多路阀用于控制液压执行元件的运动方向的运动方向和运动速度(无级地,并且不取决于负载).为此,可使多个执行元件同时并相互独立地以不同的速度和压力工作,直到所有部分流量的总和达到泵的流量…

leetcode 404. 左叶子之和

2023.7.6 这道题关键就是要判断某个节点是否为左叶子节点&#xff0c;但是必须要靠他的父节点来判断&#xff0c;逻辑就是其父节点的左孩子不为空 并且 父节点的左孩子的左孩子和右孩子都为空&#xff0c;此时该节点就是左叶子了。 下面用两种迭代法求解&#xff1a; 队列&…

聚观早报|比亚迪在巴西建工厂;国产Model系列贡献约半数交付量

今日要闻&#xff1a;比亚迪在巴西建三座工厂&#xff1b;小米对华为锁屏专利发起无效宣告请求&#xff1b;国产Model系列贡献约半数交付量&#xff1b;杨澜公司回应数百万财产被冻结&#xff1b;雅虎公司计划重新上市 比亚迪在巴西建三座工厂 7 月 5 日消息&#xff0c;据比亚…

C语言学习(三十三)---动态内存(二)

在上一节的内容中&#xff0c;我们初步学习了有关动态内存的有关内容&#xff0c;但是在使用上实际上还有很多的细节问题&#xff0c;今天我们将继续对该部分的内容进行学习&#xff0c;好了&#xff0c;话不多说&#xff0c;开整&#xff01;&#xff01;&#xff01; 动态内…

第一章 Android 基础--开发环境搭建

文章目录 1.Android 发展历程2.Android 开发机器配置要求3.Android Studio与SDK下载安装4.创建工程与创建模拟器5.观察App运行日志6.环境安装可能会遇到的问题7.练习题 本专栏主要在B站学习视频&#xff1a; B站Android视频链接 本视频范围&#xff1a;P1—P8 1.Android 发展历…

【机器学习核心总结】什么是KNN( K近邻算法)

什么是KNN( K近邻算法) 虽然名字中有NN&#xff0c;KNN并不是哪种神经网络&#xff0c;它全名K-Nearest-Neighbors&#xff1a;K近邻算法&#xff0c;是机器学习中常用的分类算法。 物以类聚&#xff0c;人以群分。KNN的基础思想很简单&#xff0c;要判断一个新数据的类别&…

AI最新开源:LMSYS Org开源LongChat、法律大语言模型ChatLaw、中文医疗对话模型扁鹊

一周SOTA&#xff1a;LMSYS Org开源LongChat、法律大语言模型ChatLaw、中文医疗对话模型扁鹊 文章目录 1. LMSYS Org发布LongChat&#xff0c;上下文碾压64K开源模型2. 北大团队发布法律大模型 ChatLaw3. 扁鹊&#xff1a;指令与多轮问询对话联合微调的医疗对话大模型 1. LMSY…

Linux 内核源代码情景分析(四)

系列文章目录 Linux 内核设计与实现 深入理解 Linux 内核 Linux 设备驱动程序 Linux设备驱动开发详解 深入理解Linux虚拟内存管理 Linux 内核源代码情景分析&#xff08;一&#xff09; Linux 内核源代码情景分析&#xff08;二&#xff09; Linux 内核源代码情景分析&#xff…

开源项目推荐 【SkyEyeSystem】

大家好&#xff0c;今天向大家推荐一个开源项目——SkyEyeSystem。 这是一个基于Spring Boot的全网热点爬虫项目&#xff0c;旨在提供全面而准确的全网热搜数据。 关于项目 SkyEyeSystem通过定时任务间隔10min爬取全网热搜数据。目前包括的平台有&#xff1a; 微博热搜B站热…

Huawei Cloud EulerOS 安装 MySQL8.0

EulerOS 安装 MySQL8.0 安装MySQL配置文件 安装MySQL 当创建一个基于EulerOS的服务器时&#xff0c;MySQL是一个常见且强大的数据库管理系统选择。在此博客中&#xff0c;我将向您展示如何在EulerOS上安装MySQL 8.0。 步骤1&#xff1a;更新系统 在开始之前&#xff0c;让我…

【FATE】联邦学习 optimizer在FATE的自定义trainer中被改变

起因 使用torch的optimizer添加了2组parameter&#xff0c;传参进入FATE的trainer后&#xff0c;optimizer被改变&#xff0c;且FATE框架无提示。 代码差不多是下面这样&#xff1a; # optimizer中加入2组优化参数&#xff08;param&#xff09; optimizer torch.optim.SGD…