装饰(Decorator Pattern)模式

在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。就增加功能来说,装饰模式比生成子类更为灵活。

使用场景:

  1. 需要扩展一个类的功能,或给一个类添加附加职责。

  2. 需要动态的给一个对象添加功能,这些功能可以再动态的撤销。

  3. 需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变的不现实。

4.当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。

优点:

1.Decorator模式与继承关系的目的都是要扩展对象的功能,但是Decorator可以提供比继承更多的灵活性。

  1. 通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。

缺点:

  1. 这种比继承更加灵活机动的特性,同时也更加复杂。

  2. 装饰模式会导致设计中出现许多小类,如果过度使用,会使程序变得很复杂。

3.装饰模式是针对抽象组件(Component)类型编程。但是,如果你要针对具体组件编程时,就应该重新思考你的应用架构,以及装饰者是否合适。当然也可以改变Component接口,增加新的公开的行为,实现“半透明”的装饰者模式。在实际项目中要做出最佳选择。

具体实现:

王者荣耀英雄角色安琪拉,学三个技能,1(Q)、2(W)、3(E)的动态实现。

//Component 英雄接口
publicinterface Hero {//学习技能void learnSkills();
}
//ConcreteComponent具体英雄安琪拉,这里可以用新的英雄实现类来增加新英雄角色
public class Angela implements Hero {private String name;public Angela(Stringname) {this.name = name;}@Overridepublic void learnSkills() {System.out.println(name + "学习了以上技能!");}
}//Decorator 技能池 通过增加英雄实现类,可以增加英雄技能池、皮肤池、武器池等待public abstractSkills implements Hero{//持有一个英雄对象接口private Hero hero;public Skills(Herohero) {this.hero = hero;}@Overridepublic void learnSkills() {if(hero != null)hero.learnSkills();}
}
//ConreteDecorator技能:Q 通过增加技能实现类即可增加技能种类
public class Skill_Q extends Skills{private String skillName;public Skill_Q(Hero hero,String skillName) {super(hero);this.skillName = skillName;}@Overridepublic voidlearnSkills() {System.out.println("学习技能Q:"+skillName);super.learnSkills();}
}//ConreteDecorator 技能:Wpublic class Skill_W extends Skills{private String skillName;public Skill_W(Hero hero,String skillName) {super(hero);this.skillName = skillName;}@Overridepublic voidlearnSkills() {System.out.println("学习技能W:"+ skillName);super.learnSkills();}}//ConreteDecorator 技能:Epublic class Skill_E extends Skills{private String skillName;public Skill_E(Hero hero,StringskillName) {super(hero);this.skillName =skillName;}@Overridepublic voidlearnSkills() {System.out.println("学习技能E:"+skillName);super.learnSkills();}}//客户端:召唤师 public class Player {public static void main(String[]args) {//选择英雄 有多少英雄接口实现类 就有多少种选择Hero hero = newAngela("安琪拉");Skills skills = new Skills(hero);//装扮的顺序不限 此为单独学习技能Skills q = new Skill_Q(skills,"火球术");Skillsw = new Skill_W(skills,"混沌火种");Skillse = new Skill_E(skills,"制热光辉");//学习技能q.learnSkills();w.learnSkills();e.learnSkills();//一整套技能学习Skills q = newSkill_Q(skills,"火球术");Skills w = newSkill_W(q,"混沌火种");Skills e = newSkill_E(w,"制热光辉");e.learnSkills();}
}

《刺激战场》游戏里面装备98K枪械,更换弹夹、倍镜。
Kar 98K有5发子弹;

装上弹匣后有10发子弹;

装上4倍镜后可以进行4倍瞄准;

装上8倍镜后可以进行4倍瞄准、8倍瞄准。

//定义具备射击功能的枪械接口
public interface Gun {//射击publicvoid fire();
}
//创建具体的枪械实现类Kar98K,默认5发子弹
public class Kar98K implements Gun {@Overridepublicvoid fire() {System.out.println("射击5次");}
}
//对枪械的弹夹进行装饰,抽象实现枪械接口
public abstract class AbstractMagazine implements Gun{
//持有枪械对象private Gun gun;public AbstractMagazine(Gun gun) {this.gun = gun;}@Overridepublic void fire() {gun.fire();}
}
//枪械弹夹装饰的具体实现类,子弹增加至10发
public class Magazine extends AbstractMagazine {public Magazine(Gun gun) {super(gun);}@Overridepublic void fire() {System.out.println("射击10次");}
}
//客户端
public class Player {public static void main(String[] args) {//捡起一把98KGun gun = newKar98K();//射击5次gun.fire();//装饰上弹匣gun = new Magazine(gun);//射击10次gun.fire();}}

现在我要装上4倍镜,使它具有4倍瞄准功能,这是枪支原本没有的功能。

扩展枪支接口功能:

//对枪械接口的继承,再增加倍镜装饰
public interface Aim4X extends Gun {public void aim4X();
}
public abstract class AbstractTelescope4X implements Aim4X {private Gun gun;public AbstractTelescope4X(Gun gun) {this.gun = gun;}@Overridepublic void fire() {gun.fire();}
}
public class Telescope4X extends AbstractTelescope4X {public Telescope4X(Gun gun) {super(gun);}@Overridepublicvoid aim4X() {System.out.println("已进入4倍瞄准模式");}
}
//55式4倍镜
public class Telescope4X55 extends AbstractTelescope4X {public Telescope4X55(Gun gun) {super(gun);}@Overridepublicvoid aim4X() {System.out.println("4倍超级瞄准已部署");}}public class Player {public static void main(String[] args) {//捡起一把98KGun gun = newKar98K();//装饰上4倍镜Aim4X aim4X = new Telescope4X(gun);//4倍瞄准]aim4X.aim4X();//射击aim4X.fire();//先装饰上弹匣gun = new Magazine(gun);//再装饰上4倍镜aim4X = new Telescope4X(gun);//4倍瞄准aim4X.aim4X();//换上55式4倍镜aim4X = new Telescope4X55(gun);//射击!aim4X.fire();}}

现在我要装上8倍镜,它具有4倍瞄准功能,也具有8倍瞄准功能。

扩展接口:

public interface Aim8X extends Aim4X {public void aim8X();}
public abstract class AbstractTelescope8X implements Aim8X {private Gun gun;public AbstractTelescope8X(Gun gun) {this.gun = gun;}@Overridepublic void fire() {gun.fire();}}
public class Telescope8X extends AbstractTelescope8X {public Telescope8X(Gun gun) {super(gun);}@Overridepublicvoid aim8X() {System.out.println("进入8倍瞄准模式");}@Overridepublicvoid aim4X() {System.out.println("进入4倍瞄准模式");}
}public class Player {public static void main(String[] args) {//先装饰上弹匣gun = new Magazine(gun);//再装饰上8倍镜aim8X = new Telescope8X(gun);//8倍瞄准aim8X.aim8X();//敌人很近,换4倍aim8X.aim4X();//射击!aim8X.fire();}}

原文:https://mp.weixin.qq.com/s/hxxNd2QJwKdOecLiDmJCcA

作者:专注一行代码

来源:微信公众号

免费分享java技术资料,需要的朋友可以在关注后私信我


GoF之装饰模式遇见王者荣耀、刺激战场相关推荐

  1. 在王者荣耀角度下分析面向对象程序设计B中23种设计模式之装饰模式

    · 装饰模式在王者荣耀中的应用 · 一.简述 在王者荣耀这款游戏中,英雄在战场上高伤害.高爆发.高移速等是所有玩家共同追求的,那么这些所谓的伤害.移速.穿透力等英雄属性我们可以通过在局外对英雄附带皮肤 ...

  2. 不要模拟器也能在电脑上玩刺激战场、第五人格和王者荣耀了你知道吗?

    是的,你没有看错,由于安卓模拟器占用太多的电脑内存,电脑配置比较低的特别是很多笔记本电脑根本用不了,为了满足这部分玩家也想在电脑上玩手游的需求,现在不需要模拟器也可以在电脑上玩刺激战场.第五人格.王者 ...

  3. 王者荣耀服务器维护S19,2020年王者荣耀S19赛季已经开启 王者荣耀S19新赛季更新内容公告 S29新赛季亮点战场升级改动讲解...

    二.玄雍危机战场改动 1.战场信息清晰度 战场上的信息清晰准确,能让召唤师更快地知道当前视野内在发生什么,及当前最重要的信息是什么,从而做出合理的战斗判断,以便更好地应对整体团战. 王者荣耀中的&qu ...

  4. 蜗牛学院:《王者荣耀》的浪潮正渐平静,“吃鸡”战场的枪声,则悄然打响...

    喜欢玩游戏的你,最近有没有发现了一些不一样? 曾经身边每天嚷嚷着要在峡谷相聚的朋友们现在有些已经相约去"吃鸡"了. 当你还在纳闷什么是"吃鸡"时,网易.小米.腾 ...

  5. 欢迎来我的岛玩!当动森、王者峡谷、刺激战场成为“真实生活”……

    全文共2051字,预计学习时长7分钟 图源:unsplash 很多人都在期盼着疫情早日过去,赶紧回归正常生活.但越来越明显的是,人们翘首以盼的"重新开放"并不意味着恢复常态.对抗冠 ...

  6. 华为鸿蒙王者荣耀视频,王者荣耀鸿蒙2.0版

    王者荣耀鸿蒙2.0版是一款专门为使用华为鸿蒙系统的玩家打造的版本,王者荣耀鸿蒙2.0版拥有跟王者荣耀官方服没有任何区别的游戏体验,并且数据完全互通,不会出现苹果安卓不互通的那种情况,王者荣耀鸿蒙2.0 ...

  7. 第二次作业:王者荣耀软件分析

    你选择的产品是? 王者荣耀 为什么选择该产品作为分析? 因为我本身是比较喜欢游戏,而且将来也想从事游戏方面的工作,对这类产品会比较感兴趣. 该产品是怎么诞生的(在什么样的背景下)? 即时战略游戏(RT ...

  8. 魅族15系统是android,魅族15系列评测:性能够用王者荣耀优化

    硬件性能:中配够用,高配优秀 硬件方面,文章前面的参数表已经写得很清楚,魅族15搭载的是高通骁龙660处理器,并配备4GB的运行内存:魅族15 Plus则搭载三星Exynos 8895,配备6GB运行 ...

  9. 绕过模拟器检测_用模拟器玩刺激战场体验差?这样设置轻松吃鸡

    [PConline 求真实验室]自从腾讯推出了手游版本的<绝地求生>之后,不仅王者荣耀的玩家数量下降,Steam版的玩家也因为受不了外挂转战<绝地求生:刺激战场>这款手游,不过 ...

最新文章

  1. 推荐!最适合初学者的18个经典开源计算机视觉项目
  2. java- 和 || 优先级的问题
  3. android 自定义模板下载,android studio 自定义模板
  4. python源码编译 带tkinter_python通过Tkinter库实现的一个简单的文本编辑器源码
  5. 微信推送封面尺寸_连封面图都搞不明白,做什么新时代的新媒体人?
  6. erp生产管理系统流程_企业生产管理好帮手——ERP智能管理系统
  7. python编程之路——类和对象
  8. C++ 0x: 内存模型
  9. python可以做系统吗_哪个操作系统更适合用来做Python开发
  10. ZOJ 3605Find the Marble(dp)
  11. 免费报名 | DataFunCon:自然语言处理论坛
  12. Three.js星空粒子特效
  13. Arduino 入门学习9 OpenBlock 可视化开发工具环境搭建
  14. 洛谷P1957 口算练习题 题解
  15. [论文翻译]A review on image segmentation techniques
  16. 搜索引擎搜索特定网站的方法 :site
  17. C Primer Plus 第五章 编程练习
  18. 解决Vscode,按住Ctrl不能跳转定义的方法
  19. 抖音影视解说制作,一般用什么必备工具?
  20. 2021-11-21 根据身高 体重计算出bmi指数,检测自己是否属于肥胖

热门文章

  1. vbnet 进程监控,监控Acad开启的数量,并且添加到开机启动
  2. ASP-PreviousPage-“未将对象引用设置到对象的实例”的错误
  3. Tcp 连接出现大量 ESTABLISHED 连接
  4. 【报告分享】2020年中国食品服务行业白皮书-饮品篇-CTR(附下载)
  5. 电子计算机的运算极限,经典电子计算机的极限..doc
  6. 创建一个复数类Complex,对复数进行数学运算
  7. 在windows下进行Openvidu webAPP开发
  8. 小菜菜mysql练习解读分析2——查询存在 01 课程但可能不存在 02 课程的情况(不存在时显示为 null )...
  9. vue使用backgroundImage属性
  10. python强制暂停线程_如何暂停线程(python)