当前位置: 首页 > news >正文

学习设计模式之装饰器模式,但是宝可梦

装饰模式

为了不改变组件的结构,动态地扩展其功能。

通常,扩展功能通过子类进行,但是继承的方式具有静态特征,耦合度高。

意图:动态地给对象添加额外的功能

主要解决:继承方式是静态特征,扩展的功能多的时候,子类会太膨胀

何时使用:不想增加很多子类的时候扩展类

1 假设情景

一个宝可梦,可以睡觉,吃饭,放技能;如果要扩展它的行为,比如Mega进化后,假设有专属的Mega技能,然后极巨化,可以放极巨技能。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GEpCBSms-1692547639876)(D:\笔记笔记笔记\设计模式.assets\image-20230820205126538-16925358896261.png)]

宝可梦接口:抽象组件(Component)

public interface Pokemon {void sleep();void eat();void spell();
}

**宝可梦实现类:**具体组件(Concrete Component)

有皮卡丘和菊草叶两种实现类,作为具体的组件

public class Pikachu implements Pokemon{@Overridepublic void sleep() {System.out.println("Pikachu is sleeping...");}@Overridepublic void eat() {System.out.println("Pikachu is eating...");}@Overridepublic void spell() {System.out.println("Pikachu is spelling...");}
}public class Chikorita implements Pokemon{@Overridepublic void sleep() {System.out.println("Chikorita is sleeping...");}@Overridepublic void eat() {System.out.println("Chikorita is eating...");}@Overridepublic void spell() {System.out.println("Chikorita is spelling...");}
}

**宝可梦变化装饰器:**抽象装饰(Decorator)

用抽象类方便扩展多种装饰,以应对宝可梦可能有的多种变化

abstract class PokemonDecorator implements Pokemon{Pokemon pokemon;public PokemonDecorator(Pokemon pokemon) {this.pokemon = pokemon;}@Overridepublic void sleep() {pokemon.sleep();}@Overridepublic void eat() {pokemon.eat();}@Overridepublic void spell() {pokemon.spell();}
}

**宝可梦具体变化:**具体装饰(Concrete Decorator)

实现了Mega进化和极巨化两种变化

public class MegaPokemon extends PokemonDecorator{public MegaPokemon(Pokemon pokemon) {super(pokemon);}public void megaSpell(){super.spell();System.out.println("Mega Power!");}
}public class DymaxPokemon extends PokemonDecorator{public DymaxPokemon(Pokemon pokemon) {super(pokemon);}public void dymaxSpell(){super.spell();System.out.println("Dymax Power!");}
}

测试类

public class DecoratorDemo {public static void main(String[] args) {Pokemon chikorita = new Chikorita();Pikachu pikachu = new Pikachu();DymaxPokemon dymaxPikachu = new DymaxPokemon(pikachu);MegaPokemon megaPikachu = new MegaPokemon(pikachu);MegaPokemon megaChikorita = new MegaPokemon(chikorita);pikachu.spell();dymaxPikachu.dymaxSpell();megaPikachu.megaSpell();megaChikorita.megaSpell();}
}
Pikachu is spelling...
Pikachu is spelling...
Dymax Power!
Pikachu is spelling...
Mega Power!
Chikorita is spelling...
Mega Power!

至此,再回头看是否实现我们的意图:动态地给一个对象添加一些额外的职责。

2 吐槽

本来宝可梦只有吃饭睡觉放技能,但是随着版本更迭,宝可梦还增加了Mega进化,极巨化,在不用子类扩展的情况下,可以使用装饰模式,当需要扩展新功能的时候,比如在朱紫版本增加了太晶化,我们只需要新写一个PokemonDecorator的子类CrystalPokemon,实现新功能(不还是用子类扩展了吗。。。),所以装饰模式的缺点就是:装饰类太多的时候比较复杂(。。。)

相关文章:

学习设计模式之装饰器模式,但是宝可梦

装饰模式 为了不改变组件的结构,动态地扩展其功能。 通常,扩展功能通过子类进行,但是继承的方式具有静态特征,耦合度高。 意图:动态地给对象添加额外的功能 主要解决:继承方式是静态特征,扩…...

【AWS】创建IAM用户;无法登录IAM用户怎么办?错误提示:您的身份验证信息错误,请重试(已解决)

目录 0.背景问题分析 1.解决步骤 0.背景问题分析 windows 11 ,64位 我的问题情景: 首先我创建了aws的账户,并且可以用ROOT用户登录,但是在登录时选择IAM用户,输入ROOT的名字和密码,就会提示【您的身份验证…...

微服务基础知识

文章目录 微服务基础知识一、系统架构的演变1、单体应用架构2、垂直应用架构3、分布式SOA架构(1)什么是SOA(2)SOA架构 4、微服务架构5、SOA和微服务的关系(1)SOA(2)微服务架构 二、分…...

倒残差结构

倒残差结构:   倒残差结构是MobileNetV2中引入的一种设计,用于增强网络的表达能力和特征提取能力,同时保持轻量级的特点。它的核心思想是在每个瓶颈块中,先使用一个扩张卷积(Dilated Convolution)&#x…...

Docker的基本使用

Docker 概念 Docker架构 docker分为客户端,Docker服务端,仓库 客户端 Docker 是一个客户端-服务器(C/S)架构程序。Docker 客户端只需要向 Docker 服务端发起请求,服务端将完成所有的工作并返回相应结果。 Docker …...

paddlenlp安装踩坑记录

错误1 ModuleNotFoundError: No module named paddle.metric我下载paddlepaddle-gpu2.5.0.post117解决了,最开始下载的2.5.1报错,post后面的117是我的cuda版本,不要写你对应的版本号 python3 -m pip install paddlepaddle-gpu2.5.0.post117…...

微服务流程引擎:简单又灵活,实现流程全生命周期管理!

伴随着日益激烈的市场竞争,传统的办公操作已经无法满足发展需要了。如果采用微服务流程引擎加油助力,就可以帮助企业更好地管理数据资源,高效做好各种表单制作,实现高效率办公。流辰信息以市场为导向,用心钻研低代码技…...

Qt表格数据处理

概述 在Qt表格数据处理中,涉及到如下几个具体的类: QAbstractItemModel:这是一个抽象基类,定义了模型(Model)的接口规范。所有的模型类都应该派生自QAbstractItemModel,并实现它的纯虚函数&…...

EasyPOI 实战总结

EasyPOI实战总结 简介 easypoi功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员 就可以方便的写出Excel导出,Excel模板导出,Excel导入,Word模板导出,通过简单的注解和模板 语言(熟悉的表达式语法),完成以前复杂的写法 使用EasyPOI 环境搭建 # 1.引入相关依…...

【LeetCode-困难题】42. 接雨水

题目 题解一:暴力双重for循环(以行计算水量) 1.先找出最高的柱子有多高(max 3) 2.然后第一个for为行数(1,2,3) 3.第二个for计算每一行的雨水量(关键在于去除…...

npm install 安装依赖,报错 Host key verification failed

设置 git 的身份和邮箱 git config --global user.name "你的名字" > 用户名 git config --global user.email “你的邮箱" > 邮箱进入 > 用户 > [你的用户名] > .ssh文件夹下,删除 known_hosts 文件即可 进入之后有可能会看到 known_hosts…...

SOLIDWORKS焊件是什么?

SOLIDWORKS是一款广泛应用于机械设计领域的三维计算机辅助设计软件。SOLIDWORKS提供了强大的焊件功能,可以帮助工程师们以更高的效率设计焊接件。本文将介绍SOLIDWORKS焊件的概念、特点以及使用方法,以期帮助读者更好地理解和应用这一关键技术。 SOLIDWO…...

2023国赛数学建模D题思路模型代码 高教社杯

本次比赛我们将会全程更新思路模型及代码,大家查看文末名片获取 之前国赛相关的资料和助攻可以查看 2022数学建模国赛C题思路分析_2022国赛c题matlab_UST数模社_的博客-CSDN博客 2022国赛数学建模A题B题C题D题资料思路汇总 高教社杯_2022国赛c题matlab_UST数模社…...

git协议实现管理(三个步骤)

GitHub官网访问: https://github.com/dashboard 初次使用git的用户要使用git协议大概需要三个步骤: 一、生成密钥对 二、设置远程仓库(本文以github为例)上的公钥 三、把git的remote url远程仓库URL可访问路径修改为git协议(以上两个步骤初次设置过以后&#xff0c…...

“深入理解JVM:探索Java虚拟机的内部机制“

标题:深入理解JVM:探索Java虚拟机的内部机制 摘要: Java虚拟机(Java Virtual Machine,JVM)是Java语言的核心,负责将Java源代码编译成可执行的字节码并运行。本篇博客将深入探索JVM的内部机制&a…...

Unity——各种特效的基本使用方法

特效是游戏制作不可或缺的一环,作为游戏开发者最重要的工作就是将特效添加到游戏中,并在合适的时机、合适的位置将特效播放出来,同时还要注意特效的管理和销毁。 某些种类的特效,如动效、贴花,还要编写脚本代码以实现…...

smiley-http-proxy-servlet 实现springboot 反向代理,结合项目鉴权,安全的引入第三方项目服务

项目中反向代理 集成第三方的服务接口或web监控界面&#xff0c;并实现与自身项目相结合的鉴权方法 依赖 smiley-http-proxy-servlet GitHub链接 2.0 版开始&#xff0c;代理切换到jakarta servlet-api<!--HTTP 代理 Servlet--><dependency><groupId>org.mit…...

(vue)多级表头且转为百分比显示

(vue)多级表头且转为百分比显示 <el-table-column align"center" label"近三个月数据情况"><el-table-column align"center" prop"amount" :label"tableLast[0]"><template slot-scope"{ row }"&g…...

Linux下C++开发

Linux下C开发 Linux 系统介绍 简介 Linux属于多用户多任务操作系统&#xff0c;而Windows属于单用户多任务操作系统Linux一切皆文件目录结构 bin 存储二进制可执行文件dev 存放的是外接设备&#xff0c;例如磁盘&#xff0c;光盘等。在其中的外接设备是不能直接被使用的&…...

GPT-3.5——从 人工智障 到 大人工智障

有人说&#xff0c;GPT是从人工智障到人工智能的蜕变&#xff0c;但是。。。 我认为&#xff0c;GPT是从 人工智障 到 大人工智障 的退化。。。 从 人工智障 到 大人工智障 GPT-3.5学术介绍No.1---- 西红柿炒钢丝球基本信息详细制作方法材料步骤 幕后花絮 No.2---- 顶尖数学家…...

对比自行维护多个API密钥Taotoken的密钥管理带来了哪些便利

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 对比自行维护多个API密钥&#xff0c;Taotoken的密钥管理带来了哪些便利 在构建基于大模型的应用时&#xff0c;开发者常常需要接入…...

NS-USBLoader完整指南:Switch文件管理、RCM注入与游戏传输的一站式解决方案

NS-USBLoader完整指南&#xff1a;Switch文件管理、RCM注入与游戏传输的一站式解决方案 【免费下载链接】ns-usbloader Awoo Installer and GoldLeaf uploader of the NSPs (and other files), RCM payload injector, application for split/merge files. 项目地址: https://…...

近屿AI学:产品经理转AI开发,开局20K

许知言&#xff08;化名&#xff09;做过B端产品经理&#xff0c;也有悉尼大学硕士背景。听起来&#xff0c;她本可以继续走产品路线。但AI开始快速改变产品形态后&#xff0c;她心里一直有个问题&#xff1a;如果未来的产品经理不懂AI开发&#xff0c;会不会很快被甩开&#x…...

AKShare架构深度解析:如何构建企业级金融数据接口平台

AKShare架构深度解析&#xff1a;如何构建企业级金融数据接口平台 【免费下载链接】akshare AKShare is an elegant and simple financial data interface library for Python, built for human beings! 开源财经数据接口库 项目地址: https://gitcode.com/gh_mirrors/aks/ak…...

【场景生成与研究】考虑时序相关性MC的场景生成与削减研究附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长毕业设计辅导、数学建模、数据处理、程序设计科研仿真。&#x1f34e;完整代码获取 定制创新 论文复现点击&#xff1a;Matlab科研工作室&#x1f447; 关注我领取海量matlab电子书和数学建模资料 &#x1f3…...

JavaWeb学习路线全解析

JavaWeb 的学习是一个系统性工程&#xff0c;需要从前端基础到后端核心&#xff0c;再到主流框架&#xff0c;最后通过项目实战来巩固。以下是一个为你量身定制的、清晰的学习路线&#xff0c;分为几个关键阶段&#xff0c;并附上每个阶段的核心要点和推荐实践。 第一阶段&…...

Taotoken在数据预处理与分析脚本中调用大模型的集成案例

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Taotoken在数据预处理与分析脚本中调用大模型的集成案例 应用场景类&#xff0c;设想一个数据科学家使用Python脚本进行数据分析时…...

HubSpot如何通过联盟计划快速增长?内容驱动型联盟营销的成功案例解析

在 SaaS 获客成本&#xff08;CAC&#xff09;不断攀升的今天&#xff0c;HubSpot 的增长奇迹始终是行业研究的焦点。除了教科书级的「集客营销&#xff08;Inbound Marketing&#xff09;」&#xff0c;其 HubSpot Affiliate Program&#xff08;联盟营销计划&#xff09;更是…...

工业微功率DC-DC选型性能对比解析:钡特电源 DH1-24S05LS 与 H2405S-1WR3 封装对照互通

在工业控制、仪器仪表、通信设备等中低功率供电场景&#xff0c;1W 级隔离工业 DC-DC 模块电源凭借小体积、高可靠、易集成的特性&#xff0c;成为硬件工程师选型的核心品类。直流电源模块作为电子系统的供电核心&#xff0c;其性能稳定性、环境耐受性与长期可靠性直接决定设备…...

086、Python数据压缩与归档:zipfile与tarfile实战笔记

086、Python数据压缩与归档:zipfile与tarfile实战笔记 一、从线上故障说起 上周排查一个生产环境问题:某服务每天生成的日志文件把磁盘撑满了。 查看代码发现,开发同事用 open().write() 直接写文本,一年下来积累了上千个文件。 其实这类场景最适合用压缩归档——既节省空…...