【装饰模式应用场景举例】
比如在玩“极品飞车”这款游戏,游戏中有对汽车进行喷涂鸦的功能,而且这个喷涂鸦是可以覆盖的,并且覆盖的顺序也影响到最后车身的显示效果,假设现在喷涂鸦具有2种样式:(1)红色火焰 (2)紫色霞光如果使用“继承父类”设计这样的功能。
使用继承来实现这种功能,并且是2种涂鸦样式,就需要创建4个子类,如果喷涂鸦有3种,4种呢?这种情况就是典型中学课程学习过的“排列与组合”,那简直就是“Head First设计模式”书中讲的“类爆炸”。
显然继承“奥迪汽车类”的这个办法是无效,而且是非常徒劳,繁琐的。
那么如何才能以“灵活”,“顺序敏感”这样的需求来实现这样的功能呢?
【装饰模式解释】
类型:结构模式
动态的对一个对象进行功能上的扩展,也可以对其子类进行功能上的扩展。
【装饰模式-JAVA代码实现】
新建一个抽象汽车父类:
packagecar_package;publicabstractclasscar_parent {//汽车抽象父类privateString make_address;privateintspeed;publicString getMake_address() {returnmake_address; }publicvoidsetMake_address(String make_address) {this.make_address=make_address; }publicintgetSpeed() {returnspeed; }publicvoidsetSpeed(intspeed) {this.speed=speed; }publicabstractvoidprint_face(); }
然后新建一个奥迪汽车子类
packagecar_package;publicclassaudi_subextendscar_parent {//奥迪汽车子类@Overridepublicvoidprint_face() { System.out.println("audi车默认的颜色为 黑色"); } }
然后再新建一个装饰者父类:
packagedecorator_package;importcar_package.car_parent;publicabstractclassdecorator_parentextendscar_parent {//装饰者父类protectedcar_parent car_parent_ref;publicvoidsetCar_parent_ref(car_parent car_parent_ref) {this.car_parent_ref=car_parent_ref; } @Overridepublicvoidprint_face() { car_parent_ref.print_face(); } }
然后再新建装饰者子类:红色火焰装饰者类:
packagedecorator_package;publicclassdecorator_audi_redextendsdecorator_parent { @Overridepublicvoidprint_face() {super.print_face(); System.out.println("给 奥迪 喷涂鸦 - 颜色为 红色火焰"); } }
然后再新建装饰者子类:紫色霞光装饰者类:
packagedecorator_package;publicclassdecorator_audi_purpleextendsdecorator_parent { @Overridepublicvoidprint_face() {super.print_face(); System.out.println("给 奥迪 喷涂鸦 - 颜色为 紫色霞光"); } }
新建一个运行类
packagemain_run;importcar_package.audi_sub;importdecorator_package.decorator_audi_purple;importdecorator_package.decorator_audi_red;publicclassmain_run {publicstaticvoidmain(String[] args) { audi_sub audi_sub_ref=newaudi_sub(); audi_sub_ref.setMake_address("广东深圳"); audi_sub_ref.setSpeed(200); decorator_audi_red decorator_audi_red_ref=newdecorator_audi_red(); decorator_audi_red_ref.setCar_parent_ref(audi_sub_ref); decorator_audi_purple decorator_audi_purple_ref=newdecorator_audi_purple(); decorator_audi_purple_ref.setCar_parent_ref(decorator_audi_red_ref); decorator_audi_purple_ref.print_face(); } }
程序运行结果如下:
audi车默认的颜色为 黑色 给 奥迪 喷涂鸦-颜色为 红色火焰 给 奥迪 喷涂鸦-颜色为 紫色霞光
从程序结果中可以看到,完全符合了前面我们的要求:“灵活”,“顺序敏感”。