您现在的位置: 主页 > 上位机技术 > JAVA > java设计模式实例详解之装饰模式
本文所属标签:
为本文创立个标签吧:

java设计模式实例详解之装饰模式

来源:网络整理 网络用户发布,如有版权联系网管删除 2018-07-23 

      设计模式是面向对象编程的热门话题之一,越来越多的开发人员认识到设计模式的重要性采用各种语言实现设计模式的文章也越来越多,但是很多开发人员发现很难将设计模式与实际开发中需要解决的具体问题相联系。
      因为使用设计模式的难点往往不在于模式的实现,而在于很难确定哪种模式可以在现实的应用场景中采用,从而导致了在现实的项目中,面对客户的压力,我们总是采用最直截了当的方法解决问题。
装饰模式应用场景举例

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

   从程序结构中可以看到,完全符合了前面我们的要求:“灵活”,“顺序敏感”。



              查看评论 回复



嵌入式交流网主页 > 上位机技术 > JAVA > java设计模式实例详解之装饰模式
 涂鸦 新建 设计模式

"java设计模式实例详解之装饰模式"的相关文章

网站地图

围观()