装饰模式

【装饰模式应用场景举例】
  比如在玩“极品飞车”这款游戏,游戏中有对汽车进行喷涂鸦的功能,而且这个喷涂鸦是可以覆盖的,并且覆盖的顺序也影响到最后车身的显示效果,假设现在喷涂鸦具有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车默认的颜色为 黑色
给 奥迪 喷涂鸦 - 颜色为 红色火焰
给 奥迪 喷涂鸦 - 颜色为 紫色霞光


  从程序结构中可以看到,完全符合了前面我们的要求:“灵活”,“顺序敏感”。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值