用装饰者模式 动手写一个导弹系统组装功能(滑稽+1)
话接上文,敌人导弹来袭,我们的雷达做出了及时反应,通过观察者模式通知了五大战区做好防御,
《用观察者模式 动手写一个导弹预警系统(滑稽)》
现在轮到我们反击了。
目前国防部发布了指示要求我设计一个程序可以组装出不同类型的导弹,但是要保证能更有弹性的将不同的功能模块加载到导弹上去。由此我选择了装饰者模式。
设计原则:对扩展开放,对修改关闭。(开放关闭原则)
装饰者模式定义:动态的讲责任附加到对象上,若要扩展功能,装饰者提供了比集成更加有弹性的替代方案。
组件:通常是被装饰的对象
装饰者:去包装组件
装饰者模式意义:解决因缤纷复杂的继承导致类爆炸的问题,比如同一种类型的物品有多种更细的分类,总不能为所有东西都建立一个类吧,装饰者模式意味着一群装饰者去包装一个具体的类。
装饰者模式注意事项:
- 如果你要为你的组件设置一些特殊的行为或特殊的事情,那么装饰者模式并不合适,或者说需要重新考虑。
- 设计的时候,应该允许行为被扩展,而不是修改现有的代码。
- 装饰者类应该和被包装的组件具备同样的类型。
- 装饰者可以有无数多个
- 但是无数的装饰者也会增加系统的复杂度
下面我们来实现具体的任务:
首先组装不同的导弹需要对导弹进行一个高度抽象,于是定义一个抽象导弹类
/** * 导弹基类 */ public abstract class Missile {protected String descriptiopn;//导弹描述信息 public abstract String getDescription(); }
接着定义不同的组件,也就是子类,子类代表了不同的导弹类型(巡航导弹,常规导弹),都是继承父类并实现抽象父类的抽象方法。
/** * 巡航导弹 */ public class CruiseMissile extends Missile {public CruiseMissile() {descriptiopn = "导弹名称:巡航导弹 ";}@Override public String getDescription() {return descriptiopn;} }
/** * 常规导弹 */ public class ConventionalMissile extends Missile {public ConventionalMissile() {descriptiopn = "导弹名称:常规导弹 ";}@Override public String getDescription() {return descriptiopn;} }
下面定义装饰者,装饰者的含义可以简单理解为导弹固有类型的基础上增加的可扩展的功能,同时不用去修改原有的基础类型导弹。如下所示,我准备增加一些扩展模块(发动机、弹头)
首先定义一个装饰者抽象父类,它不仅承接了顶级父类,还可以增加额外的装饰功能
public abstract class MissileDecorator extends Missile {public abstract String getDescription(); }
下面定义不同的装饰具体类
/** * 核弹头 */ public class Warhead_Nuclear extends MissileDecorator {Missile missile;public Warhead_Nuclear(Missile missile){this.missile = missile;}@Override public String getDescription() {return missile.getDescription() + "[战斗部]:增加了核弹头,方圆1公里全部化为灰烬 ";} }
/** * 高爆弹头 */ public class Warhead_HighExplosive extends MissileDecorator {Missile missile;public Warhead_HighExplosive(Missile missile){this.missile = missile;}@Override public String getDescription() {return missile.getDescription() + "[战斗部]:增加了高爆弹头,方圆50米全部化为灰烬 ";} }
/** * YF77氢氧燃料发动机 */ public class Engine_YF77 extends MissileDecorator {Missile missile;public Engine_YF77(Missile missile){this.missile = missile;}@Override public String getDescription() {return missile.getDescription() + "[发动机]:增加了YF77氢氧燃料发动机,可以在太空中对抗外星飞船了 ";} }
/** * 液氧煤油发动机 */ public class Engine_RD170 extends MissileDecorator {Missile missile;public Engine_RD170(Missile missile){this.missile = missile;}@Override public String getDescription() {return missile.getDescription() + "[发动机]:增加了这款超大推力的液氧煤油发动机,你将飞的更快,载的更多 ";} }
最后我们有了导弹的具体类型!有了导弹的扩展组件!就让我们来组装一枚强大的导弹把
当敌人在某地建造了许多弹药库时,我们可以发射一枚巡航导弹去击毁它,但是普通的巡航导弹威力太小,于是我们企图为导弹增加高爆弹头。
与此同时敌人在大洋彼岸的指挥部已经曝光,我们的常规导弹无法射到那么远的距离,于是我们需要增加更强力的发动机,并且增加一枚核弹头达到100%摧毁的目的。
/** * 我兔国防部 */ public class MOD {public static void main(String[] args) {Missile cruiseMissile = new CruiseMissile(); // 巡航导弹cruiseMissile = new Warhead_HighExplosive(cruiseMissile); //增加高爆弹头装饰者,来增加额外的功能System.out.println(cruiseMissile.getDescription());Missile conventionalMissile = new ConventionalMissile(); //常规导弹conventionalMissile = new Warhead_Nuclear(conventionalMissile); //增加核弹头装饰者conventionalMissile = new Engine_RD170(conventionalMissile); //增加发动机装饰者conventionalMissile = new Engine_YF77(conventionalMissile);System.out.println(conventionalMissile.getDescription());} }
于是运行系统我们创造出了两枚新的导弹
这样一来我们可以组合出各种用途的导弹,来达到各种目的,而且不用为所有类型的武器都去新建一个类。
用装饰者模式 动手写一个导弹系统组装功能(滑稽+1)相关推荐
- 自己动手写一个推荐系统,推荐系统小结,推荐系统:总体介绍、推荐算法、性能比较, 漫谈“推荐系统”, 浅谈矩阵分解在推荐系统中的应用...
自己动手写一个推荐系统 废话: 最近朋友在学习推荐系统相关,说是实现完整的推荐系统,于是我们三不之一会有一些讨论和推导,想想索性整理出来. 在文中主要以工程中做推荐系统的流程着手,穿插一些经验之谈,并 ...
- 自己动手写一个简单的bootloader
自己动手写一个简单的bootloader 15年10月31日19:44:27 (一) start.S 写这一段代码前,先要清楚bootloader开始的时候都做什么了.无非就是硬件的初始化,我们想要写 ...
- 自己动手写一个仿Docker虚拟容器
自己动手写一个仿Docker虚拟容器 本项目参照书籍<自己动手写Docker> 作者:陈显鹭(花名:遥鹭)-阿里云高级研发工程师等 项目地址:https://gitee.com/Sheng ...
- java 手编线程池_死磕 java线程系列之自己动手写一个线程池
欢迎关注我的公众号"彤哥读源码",查看更多源码系列文章, 与彤哥一起畅游源码的海洋. (手机横屏看源码更方便) 问题 (1)自己动手写一个线程池需要考虑哪些因素? (2)自己动手写 ...
- 自己动手写一个印钞机 第四章
2019独角兽企业重金招聘Python工程师标准>>> 作者:阿布? 未经本人允许禁止转载 ipython notebook git版本 目录章节地址: 自己动手写一个印钞机 第一章 ...
- Spring Boot 动手写一个 Start
我们在使用SpringBoot 项目时,引入一个springboot start依赖,只需要很少的代码,或者不用任何代码就能直接使用默认配置,再也不用那些繁琐的配置了,感觉特别神奇.我们自己也动手写一 ...
- 自己动手写一个nodejs的日志生成器
自己动手写一个nodejs的logger 最近正在边学边用node.js开发个人应用的server,由于有用到websocket相关,想对websocket的通信选择性的做下日志记录,所以萌发了自己动 ...
- 自己动手写一个印钞机 第二章
2019独角兽企业重金招聘Python工程师标准>>> 作者:阿布? 未经本人允许禁止转载 ipython notebook git版本 目录章节地址: 自己动手写一个印钞机 第一章 ...
- 学习较底层编程:动手写一个C语言编译器
动手编写一个编译器,学习一下较为底层的编程方式,是一种学习计算机到底是如何工作的非常有效方法. 编译器通常被看作是十分复杂的工程.事实上,编写一个产品级的编译器也确实是一个庞大的任务.但是写一个小巧可 ...
最新文章
- Fail to find the dnn implementation. [Op:CudnnRNN]解决办法
- MySQL中的InnoDB是怎么解决幻读的?
- golang中的panic
- 2.4带通采样的实际问题
- DataGrid内容的导出
- C orm mysql_Simple MySQL-C ORM
- mysql 外键关联
- VFP下利用API调用帮助
- asp.net 学习交流群 130017551
- day 5 名片管理系统-文件版
- 问题三十七:C++怎么解一元四次方程?(2)——怎么解一元三次方程
- 在 Mac 上如何使用 iCloud 钥匙串保护信息安全?
- 精品化游戏《热血征途》掀起网页游戏大变革
- 翼支付高速发展背后,甜橙金融的云化智能变革
- 计算机仿真和vr的区别,你真的知道AR与VR的区别吗?
- 在用AI死磕垃圾分类这件小事上,麻省理工、MaxAI们创造了这些利器,神助攻还是花拳绣腿?...
- Java生成四种格式的二维码
- NGUI------UIToggle
- 栈和队列的相同点和不同点
- 兴趣爱好页面.html,兴趣筛选页面.html