首页 电脑 电脑学堂 查看内容

设计模式-快餐简解-【装饰模式】

2009-7-15 15:21 536 0

摘要:      【装饰模式应用场景举例】   比如在玩“极品飞车”这款游戏,游戏中有对汽车进行喷涂鸦的功能,而且这个喷涂鸦是可以覆盖的,并且覆盖的顺序也影响到最后车...

     【装饰模式应用场景举例】   比如在玩“极品飞车”这款游戏,游戏中有对汽车进行喷涂鸦的功能,而且这个喷涂鸦是可以覆盖的,并且覆盖的顺序也影响到最后车身的显示效果,假设现在喷涂鸦具有2种样式:(1)红色火焰 (2)紫色霞光如果使用“继承父类”设计这样的功能,那么类图就像如下的这样:   从图中可以看到使用继承来实现这种功能,并且是2种涂鸦样式,就需要创建4个子类,如果喷涂鸦有3种,4种呢?这种情况就是典型中学课程学习过的“排列与组合”,那简直就是“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(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车默认的颜色为 黑色   给 奥迪 喷涂鸦 - 颜色为 红色火焰   给 奥迪 喷涂鸦 - 颜色为 紫色霞光   从程序结构中可以看到,完全符合了前面我们的要求:“灵活”,“顺序敏感”。   【装饰模式-MyEclipse6项目JAVA代码实现】
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

最新评论

返回顶部