【装饰模式应用场景举例】 比如在玩极品飞车这款游戏游戏中有对汽车进行喷涂鸦的功能而且这个喷涂鸦是可以覆盖的并且覆盖的顺序也影响到最后车身的显示效果假设现在喷涂鸦具有种样式()红色火焰()紫色霞光如果使用继承父类设计这样的功能那么类图就像如下的这样 从图中可以看到使用继承来实现这种功能并且是种涂鸦样式就需要创建个子类如果喷涂鸦有种种呢?这种情况就是典型中学课程学习过的排列与组合那简直就是Head First设计模式书中讲的类爆炸 显然继承奥迪汽车类的这个办法是无效而且是非常徒劳繁琐的 那么如何才能以灵活顺序敏感这样的需求来实现这样的功能呢? 【装饰模式解释】 类型结构模式 动态的对一个对象进行功能上的扩展也可以对其子类进行功能上的扩展 【装饰模式UML图】 【装饰模式JAVA代码实现】 新建一个抽象汽车父类 packagecar_package; publicabstractclasscar_parent{ //汽车抽象父类 privateStringmake_address; privateintspeed; publicStringgetMake_address(){ returnmake_address; } publicvoidsetMake_address(Stringmake_address){ thismake_address=make_address; } publicintgetSpeed(){ returnspeed; } publicvoidsetSpeed(intspeed){ thisspeed=speed; } publicabstractvoidprint_face(); } 然后新建一个奥迪汽车子类 packagecar_package;publicclassaudi_subextendscar_parent{ //奥迪汽车子类 @Override publicvoidprint_face(){ Systemoutprintln(audi车默认的颜色为黑色); } } 然后再新建一个装饰者父类 packagedecorator_package;importcar_packagecar_parent; publicabstractclassdecorator_parentextendscar_parent{ //装饰者父类 protectedcar_parentcar_parent_ref; publicvoidsetCar_parent_ref(car_parentcar_parent_ref){ thiscar_parent_ref=car_parent_ref; } @Override publicvoidprint_face(){ car_parent_refprint_face(); } } 然后再新建装饰者子类红色火焰装饰者类 packagedecorator_package;publicclassdecorator_audi_redextendsdecorator_parent{ @Override publicvoidprint_face(){ superprint_face(); Systemoutprintln(给奥迪喷涂鸦颜色为红色火焰); } } 然后再新建装饰者子类紫色霞光装饰者类 packagedecorator_package;publicclassdecorator_audi_purpleextendsdecorator_parent{ @Override publicvoidprint_face(){ superprint_face(); Systemoutprintln(给奥迪喷涂鸦颜色为紫色霞光); } } 新建一个运行类 packagemain_run;importcar_packageaudi_sub; importdecorator_packagedecorator_audi_purple; importdecorator_packagedecorator_audi_red; publicclassmain_run{ publicstaticvoidmain(String[]args){ audi_subaudi_sub_ref=newaudi_sub(); audi_sub_refsetMake_address(北京市朝阳区); audi_sub_refsetSpeed(); decorator_audi_reddecorator_audi_red_ref=newdecorator_audi_red(); decorator_audi_red_refsetCar_parent_ref(audi_sub_ref); decorator_audi_purpledecorator_audi_purple_ref=newdecorator_audi_purple(); decorator_audi_purple_refsetCar_parent_ref(decorator_audi_red_ref); decorator_audi_purple_refprint_face(); } } 程序运行结果如下 audi车默认的颜色为黑色给奥迪喷涂鸦颜色为红色火焰 给奥迪喷涂鸦颜色为紫色霞光 从程序结构中可以看到完全符合了前面我们的要求灵活顺序敏感 【装饰模式MyEclipse项目JAVA代码实现】 装饰模式decorator示例代码点击 |