知识大全 设计模式-快餐简解-装饰模式
Posted 霞光
篇首语:上如阶尽管费力,却一步比一步高。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 设计模式-快餐简解-装饰模式相关的知识,希望对你有一定的参考价值。
【装饰模式应用场景举例】
比如在玩 极品飞车 这款游戏 游戏中有对汽车进行喷涂鸦的功能 而且这个喷涂鸦是可以覆蓋的 并且覆蓋的顺序也影响到最后车身的显示效果 假设现在喷涂鸦具有 种样式 ( )红色火焰 ( )紫色霞光如果使用 继承父类 设计这样的功能 那么类图就像如下的这样
从图中可以看到使用继承来实现这种功能 并且是 种涂鸦样式 就需要创建 个子类 如果喷涂鸦有 种 种呢?这种情况就是典型中学课程学习过的 排列与组合 那简直就是 Head First设计模式 书中讲的 类爆炸
显然继承 奥迪汽车类 的这个办法是无效 而且是非常徒劳 繁琐的
那么如何才能以 灵活 顺序敏感 这样的需求来实现这样的功能呢?
【装饰模式解释】
类型 结构模式
动态的对一个对象进行功能上的扩展 也可以对其子类进行功能上的扩展
【装饰模式UML图】
【装饰模式 JAVA代码实现】
新建一个抽象汽车父类
package car_package;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;public class audi_sub extends car_parent // 奥迪汽车子类 @Override public void print_face() System out println( audi车默认的颜色为 黑色 );然后再新建一个装饰者父类
package decorator_package;import car_package car_parent;public abstract class decorator_parent extends car_parent // 装饰者父类 protected car_parent car_parent_ref; public void setCar_parent_ref(car_parent car_parent_ref) this car_parent_ref = car_parent_ref; @Override public void print_face() car_parent_ref print_face();然后再新建装饰者子类 红色火焰装饰者类
package decorator_package;public class decorator_audi_red extends decorator_parent @Override public void print_face() super print_face(); System out println( 给 奥迪 喷涂鸦 颜色为 红色火焰 );然后再新建装饰者子类 紫色霞光装饰者类
package decorator_package;public class decorator_audi_purple extends decorator_parent @Override public void print_face() super print_face(); System out println( 给 奥迪 喷涂鸦 颜色为 紫色霞光 );新建一个运行类
package main_run;import car_package audi_sub;import decorator_package decorator_audi_purple;import decorator_package decorator_audi_red;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( ); 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车默认的颜色为 黑色给 奥迪 喷涂鸦 颜色为 红色火焰给 奥迪 喷涂鸦 颜色为 紫色霞光从程序结构中可以看到 完全符合了前面我们的要求 灵活 顺序敏感
【装饰模式 MyEclipse 项目JAVA代码实现】
cha138/Article/program/Java/gj/201311/27520相关参考