大话设计模式——4.装饰模式(Decorator Pattern)

1.定义

1)可以在不改动原有对象代码的情况下扩展对象的功能,通过聚合的方式相较于继承更加灵活。
2)UML图

2.示例

汽车有很多装饰可选,如座椅、音响、轮胎等都可以进行自定义组装
1)抽象汽车对象

public interface Vehicle {/*** 产品名称*/String productName();/*** 价格** @return*/double price();
}

2)具体汽车对象

public class BMWVehicle implements Vehicle {private final String vehicleName = "宝马X7";@Overridepublic String productName() {return vehicleName;}@Overridepublic double price() {return Math.pow(10, 6);}
}

3)汽车装饰对象

public class VehicleDecorator implements Vehicle {// 聚合private Vehicle vehicle;public VehicleDecorator(Vehicle vehicle) {this.vehicle = vehicle;}@Overridepublic String productName() {return vehicle.productName();}@Overridepublic double price() {return vehicle.price();}
}

4)座椅装饰对象

public class SeatDecorator extends VehicleDecorator {public SeatDecorator(Vehicle vehicle) {super(vehicle);}@Overridepublic String productName() {return super.productName() + "+" + "真皮座椅*4";}@Overridepublic double price() {return super.price() + Math.pow(10, 5);}
}

5)音响装饰对象

public class SoundDecorator extends VehicleDecorator {public SoundDecorator(Vehicle vehicle) {super(vehicle);}@Overridepublic String productName() {return super.productName() + "+" + "雅马哈音响*4";}@Overridepublic double price() {return super.price() + Math.pow(10, 4);}
}
运行结果
public class Main {public static void main(String[] args) {Vehicle myCar = new BMWVehicle();// 音响装饰myCar = new SoundDecorator(myCar);// 座椅装饰myCar = new SeatDecorator(myCar);System.out.println("配置:" + myCar.productName());System.out.println("价格:" + myCar.price());}
}

在这里插入图片描述

3.应用场景

JDK中的IO流设计中就使用到了该模式。

// 配置缓冲流
InputStream  in = new BufferedInputStream(new FileInputStream(""););

InputStream:抽象组件类
在这里插入图片描述

FileInputStream:被装饰类
在这里插入图片描述
FilterInputStream:装饰抽象类
在这里插入图片描述
BufferedInputStream:具体装饰类型
在这里插入图片描述

4.总结

1)优点

  • 扩展功能不必修改原有代码,符合开闭原则
  • 较继承方式更为灵活

2)缺点

  • 会构建较多子类,代码编写变的复杂,增加了系统的复杂度与运维理解难度

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

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

相关文章

数据结构------栈(Stack)和队列(Queue)

也是好久没写博客了,那今天就回归一下,写一篇数据结构的博客吧。今天要写的是栈和队列,也是数据结构中比较基础的知识。那么下面开始今天要写的博客了。 目录 栈(Stack) 队列(Queue) 喜欢就点…

AI论文速读 | 立场观点:时间序列分析,大模型能告诉我们什么?

题目:Position Paper: What Can Large Language Models Tell Us about Time Series Analysis 作者:Ming Jin ; Yifan Zhang ; Wei Chen ; Kexin Zhang ; Yuxuan Liang ; Bin Yang ; Jindong Wang ; Shirui Pan ; Qingsong Wen 机构:莫纳什大…

form 表单 转换为json-多种(通用/多维数组) 全方案

JSON 在 JavaScript 中重要,因其轻量、通用、易读,适用于数据交换、存储和传输。 为什么写这个文章,废话不多,直接近主题。 一、通用 一般采用jquery编写 var key $(#"cyberwin_form_card_newadd").serialize(); 结…

类和对象(2)——距离C++又近了一步

目录 一、构造函数 1.1声明和定义构造函数 1.2成员名和参数名 1.3构造函数的使用 1.4初始化列表 二、析构函数 2.1析构函数的概念 2.2析构函数的性质 三、拷贝构造函数 四、赋值运算符重载 4.1运算符重载 4.2赋值运算符重载 一、构造函数 我们知道,C中…

项目解决方案: 实时视频拼接方案介绍

目 录 1、实时视频拼接概述 2、适用场景 3、系统介绍 3.1拼接形式 3.1.1横向拼接 3.1.2纵向拼接 3.2前端选择 3.2.1前端类型 3.2.2推荐配置 3.3后端选择 3.3.1录像回放 3.3.2客户端展示 4、拼接方案介绍 4.1基于4K摄像机的拼接方案 4.1.1系统架构…

Pytorch从零开始实战19

Pytorch从零开始实战——生成手势图像 本系列来源于365天深度学习训练营 原作者K同学 文章目录 Pytorch从零开始实战——生成手势图像环境准备模型选择模型训练模型分析总结 环境准备 本文基于Jupyter notebook,使用Python3.8,Pytorch2.0.1cu118&…

webrtc

stun服务 阿里云服务器安全组添加端口开放 webrtc-streamer视屏流服务器搭建 - 简书

Prometheus-监控远程linux的主机

一、本地访问 1、访问 http://8.137.122.212:9090/2、查看监控的主机 默认只监控了本机一台主机 这里的IP地址原本是‘localhost’,为了方便我将‘localhost’换成了主机的IP地址 现在看只监控了本机一台主机 3、查看监控数据 通过http://8.137.122.212:9090/m…

RT-Thread studio上创建一个STM32F103的CAN通讯功能

前言 (1)如果有嵌入式企业需要招聘湖南区域日常实习生,任何区域的暑假Linux驱动实习岗位,可C站直接私聊,或者邮件:zhangyixu02gmail.com,此消息至2025年1月1日前均有效 (2&#xff0…

1.1 编程环境的安装

汇编语言 汇编语言环境部署 第二个运行程序直接双击安装一直下一步即可MASM文件复制到D盘路径下找到dosbox安装路径:C:\Program Files (x86)\DOSBox-0.74找到该文件双击打开它,修改一下窗口大小 把这两行改成如下所示 运行dos,黑框中输入mou…

C#,数值计算,求解微分方程的吉尔(Gear)四阶方法与源代码

1 微分方程 微分方程,是指含有未知函数及其导数的关系式。解微分方程就是找出未知函数。 微分方程是伴随着微积分学一起发展起来的。微积分学的奠基人Newton和Leibniz的著作中都处理过与微分方程有关的问题。微分方程的应用十分广泛,可以解决许多与导数…

【Web安全靶场】sqli-labs-master 21-37 Advanced-Injection

sqli-labs-master 21-37 Advanced-Injection 第一关到第二十关请见专栏 文章目录 sqli-labs-master 21-37 Advanced-Injection第二十一关-Cookie注入第二十二关-Cookie注入第二十三关-注释符过滤的报错注入第二十四关-二次注入第二十五关-过滤OR、AND双写绕过第二十五a关-过滤…

【嵌入式——QT】日期与定时器

日期 QTime:时间数据类型,仅表示时间,如 16:16:16;QDate:日期数据类型,仅表示日期,如2024-1-22;QDateTime:日期时间数据类型,表示日期和时间,如2…

多个版本的Python如何不冲突?

转载文章,防止忘记或删除 转载于:电脑中存在多个版本的Python如何不冲突? - 知乎 (zhihu.com) 如何安装多版本的Python并与之共存? 如果你的工作涉及到Python多版本之间开发或测试,那么请收藏本文, 如果你…

【python】Python Turtle绘制流星雨动画效果【附源码】

在这篇技术博客中,我们将学习如何使用 Python 的 Turtle 模块绘制一个流星雨的动画效果。通过简单的代码实现,我们可以在画布上展现出流星闪耀的场景,为视觉带来一丝神秘与美感。 一、效果图: 二、准备工作 (1)、导入…

每日一题——LeetCode1544.整理字符串

方法一 字符串转数组删除元素 将字符串转为数组&#xff0c;遍历数组&#xff0c;如果碰到同一字母大写小写连续出现就原地删除这两个元素&#xff0c;最后把数组转回字符串并返回 var makeGood function(s) {let arrs.split()for(let i0;i<s.length-1;i){if(arr[i]!arr[…

【程序员的金三银四求职宝典】《春风拂面,代码在手:程序员的金三银四求职指南》

《春风拂面&#xff0c;代码在手&#xff1a;程序员的金三银四求职指南》 随着春风的轻拂&#xff0c;大地复苏&#xff0c;万物更新。在这个生机勃勃的季节&#xff0c;不仅自然界在迎接新生&#xff0c;对于广大的程序员朋友们而言&#xff0c;这也是一个全新的开始——金三…

windows U盘不能识别

windows U盘不能识别 1、问题描述2、问题分析解决3、把U盘插到windows电脑上试试能不能识别 1、问题描述 windwos u盘不能识别 u盘被拿到mac电脑上做了启动盘之后&#xff0c;就不能被windows识别了。题主很奇怪里面被mac电脑的同学放了什么&#xff0c;因此想到把优盘挂载到L…

免费的Git图形界面工具sourceTree介绍

阅读本文同时请参阅-----代码库管理工具Git介绍 sourceTree是一款免费的Git图形界面工具&#xff0c;它简化了Git的使用过程&#xff0c;使得开发者可以更加方便地下载代码、更新代码、提交代码和处理冲突。下面我将详细介绍如何使用sourceTree进行这些操作。 1.下载和…

05|Mysql锁分类

1. 锁分类 1.1根据性能 乐观锁 ● 版本号 ● 读多场景 ● 第二次循环需要读取到最新的数据统计 示例 while{ // 1.调用方法获取当前版本号 getCurrentBalanceAndVersion(accountId); // 2.Java运算newBalance Balance 500; updateAccountBalance(account…