设计模式之装饰模式

来源:互联网 发布:resttemplate json 编辑:程序博客网 时间:2024/05/30 23:13

比如在玩“极品飞车”这款游戏,游戏中有对汽车进行喷涂鸦的功能,而且这个喷涂鸦是可以覆盖的,并且覆盖的顺序也影响到最后车身的显示效果,假设现在喷涂鸦具有2种样式:(1)红色火焰 (2)紫色霞光如果使用“继承父类”设计这样的功能,那么类图就像如下的这样:


从图中可以看到使用继承来实现这种功能,并且是2种涂鸦样式,就需要创建4个子类,如果喷涂鸦有3种,4种呢?这种情况就是典型中学课程学习过的“排列与组合”,那简直就是“Head First设计模式”书中讲的“类爆炸”。
显然继承“奥迪汽车类”的这个办法是无效,而且是非常徒劳,繁琐的。
那么如何才能以“灵活”,“顺序敏感”这样的需求来实现这样的功能呢?
【装饰模式解释】
类型:结构模式
动态的对一个对象进行功能上的扩展,也可以对其子类进行功能上的扩展。
【装饰模式UML图】


【装饰模式-JAVA代码实现】
新建一个抽象汽车父类:

package car_package;/** * @author MyHP *汽车抽象父类 */public abstract class Car_parent {private String make_address;private int speed;public String getMake_address() {return make_address;}public void setMake_address(String make_address) {this.make_address = make_address;}public int getSpeed() {return speed;}public void setSpeed(int speed) {this.speed = speed;}public abstract void print_face();}
然后新建一个奥迪汽车子类

package car_package;/** * @author MyHP *奥迪骑车子类 */public class Audi_sub extends Car_parent{@Overridepublic void print_face() {System.out.println("audi车默认的颜色为 黑色");}}
然后再新建一个装饰者父类:

package decorator_package;import car_package.Car_parent;public abstract class Decorator_parent extends Car_parent {Car_parent car_parent_ref;public void setCar_parent_ref(Car_parent car_parent_ref) {this.car_parent_ref = car_parent_ref;}@Overridepublic void print_face() {car_parent_ref.print_face();}}

然后再新建装饰者子类:红色火焰装饰者类:

package decorator_package;public class Decorator_audi_red extends Decorator_parent {@Overridepublic void print_face(){super.print_face();System.out.println("给奥迪喷涂鸦颜色为红色火焰");}}
然后再新建装饰者子类:紫色霞光装饰者类:

package decorator_package;public class Decorator_audi_purple extends Decorator_parent {@Overridepublic void print_face(){super.print_face();System.out.println("给奥迪喷涂鸦颜色为紫色霞光");}}
新建一个运行类
package main_run;import car_package.Audi_sub;import decorator_package.Decorator_audi_red;import decorator_package.Decorator_audi_purple;public class Main_run {public static void main(String[] args){Audi_sub audi_sub_ref = new Audi_sub();audi_sub_ref.setMake_address("辽宁省");audi_sub_ref.setSpeed(200);Decorator_audi_red decorator_audi_red_ref = new Decorator_audi_red();decorator_audi_red_ref.setCar_parent_ref(audi_sub_ref);Decorator_audi_purple decorator_audi_purple_ref = new Decorator_audi_purple();decorator_audi_purple_ref.setCar_parent_ref(decorator_audi_red_ref);decorator_audi_purple_ref.print_face();}}

程序运行结果如下:
audi车默认的颜色为 黑色给奥迪喷涂鸦颜色为红色火焰给奥迪喷涂鸦颜色为紫色霞光
从程序结构中可以看到,完全符合了前面我们的要求:“灵活”,“顺序敏感”。

转载自:http://java.chinaitlab.com/model/768909.html

原创粉丝点击