您现在的位置是:首页 >

怎么打开极简模式 设计模式-快餐简解-【装饰模式】

火烧 2021-06-06 22:40:40 1042
设计模式-快餐简解-【装饰模式】   【装饰模式应用场景举例】  比如在玩 极品飞车 这款游戏 游戏中有对汽车进行喷涂鸦的功能 而且这个喷涂鸦是可以覆蓋的 并且覆蓋的顺序也影响到最后车身的显示效果 假

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

  装饰模式应用场景举例

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

  

  从图中可以看到使用继承来实现这种功能 并且是 种涂鸦样式 就需要创建 个子类 如果喷涂鸦有 种 种呢?这种情况就是典型中学课程学习过的 排列与组合 那简直就是 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代码实现

lishixinzhi/Article/program/Java/gj/201311/27520  
永远跟党走
  • 如果你觉得本站很棒,可以通过扫码支付打赏哦!

    • 微信收款码
    • 支付宝收款码