话接上文,敌人导弹来袭,我们的雷达做出了及时反应,通过观察者模式通知了五大战区做好防御,
现在轮到我们反击了。
目前国防部发布了指示要求我设计一个程序可以组装出不同类型的导弹,但是要保证能更有弹性的将不同的功能模块加载到导弹上去。由此我选择了装饰者模式。
设计原则:对扩展开放,对修改关闭。(开放关闭原则)
装饰者模式定义:动态的讲责任附加到对象上,若要扩展功能,装饰者提供了比集成更加有弹性的替代方案。
组件:通常是被装饰的对象
装饰者:去包装组件
装饰者模式意义:解决因缤纷复杂的继承导致类爆炸的问题,比如同一种类型的物品有多种更细的分类,总不能为所有东西都建立一个类吧,装饰者模式意味着一群装饰者去包装一个具体的类。
装饰者模式注意事项:
- 如果你要为你的组件设置一些特殊的行为或特殊的事情,那么装饰者模式并不合适,或者说需要重新考虑。
- 设计的时候,应该允许行为被扩展,而不是修改现有的代码。
- 装饰者类应该和被包装的组件具备同样的类型。
- 装饰者可以有无数多个
- 但是无数的装饰者也会增加系统的复杂度
下面我们来实现具体的任务:
首先组装不同的导弹需要对导弹进行一个高度抽象,于是定义一个抽象导弹类
/** * 导弹基类 */ 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()); } }
于是运行系统我们创造出了两枚新的导弹
这样一来我们可以组合出各种用途的导弹,来达到各种目的,而且不用为所有类型的武器都去新建一个类。