当前位置: 首页 > 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,实现新功能(不还是用子类扩展了吗。。。),所以装饰模式的缺点就是:装饰类太多的时候比较复杂(。。。)

http://www.lryc.cn/news/133839.html

相关文章:

  • 【AWS】创建IAM用户;无法登录IAM用户怎么办?错误提示:您的身份验证信息错误,请重试(已解决)
  • 微服务基础知识
  • 倒残差结构
  • Docker的基本使用
  • paddlenlp安装踩坑记录
  • 微服务流程引擎:简单又灵活,实现流程全生命周期管理!
  • Qt表格数据处理
  • EasyPOI 实战总结
  • 【LeetCode-困难题】42. 接雨水
  • npm install 安装依赖,报错 Host key verification failed
  • SOLIDWORKS焊件是什么?
  • 2023国赛数学建模D题思路模型代码 高教社杯
  • git协议实现管理(三个步骤)
  • “深入理解JVM:探索Java虚拟机的内部机制“
  • Unity——各种特效的基本使用方法
  • smiley-http-proxy-servlet 实现springboot 反向代理,结合项目鉴权,安全的引入第三方项目服务
  • (vue)多级表头且转为百分比显示
  • Linux下C++开发
  • GPT-3.5——从 人工智障 到 大人工智障
  • 创建型(四) - 原型模式
  • ABAP 定义复杂的数据结构
  • HCIP第四节-----------------------------BGP
  • Temu闯关日韩受挫?跨境电商卖家如何打磨好营销链路
  • console的几个常用用法
  • 服务器数据恢复-HP EVA存储VDISK被删除的数据恢复案例
  • (搜索) 剑指 Offer 13. 机器人的运动范围 ——【Leetcode每日一题】
  • Java并发编程之线程池详解
  • 开源数据库Mysql_DBA运维实战 (总结)
  • 图神经网络与分子表征:1. 分子图和图神经网络基础
  • Spring Boot与Redisson的整合。分布式锁