学科分类
目录
Java Web

装饰设计模式

HttpServletRequestWrapper和HttpServletResponseWrapper作为request和response对象的包装类,它们都采用了装饰设计模式。所谓装饰设计模式,指的是通过包装类的方式,动态增强某个类的功能。为了大家更好的理解装饰设计模式,接下来,先来简单介绍一下装饰设计模式的特点,具体如下:

● 包装类要和被包装对象实现同样的接口。

● 包装类持有一个被包装对象,例如在HttpServletRequestWrapper定义的构造方法中,需要传递一个HttpServletRequest类型的参数。

● 包装类在实现接口的过程中,对于不需要包装的方法原封不动地调用被包装对象的方法来实现,对于需要包装的方法自己实现。

了解了装饰设计模式的特点,接下来,通过一个案例来演示如何实现装饰设计模式,在chapter04工程的cn.itcast.chapter04. decorator包中,编写PhoneDemo.java程序,具体如例1所示。

例1 PhoneDemo.java

 1  package cn.itcast.chapter04.decorator;

 2  /**

 3  * 手机 

 4  */

 5  interface Phone{

 6    // 手机的功能

 7    void action();

 8  }

 9  /**

 10  * 非智能手机 

 11  */

 12 class Non_SmartPhone implements Phone{

 13   // 非智能机具有打电话的功能

 14   public void action() {

 15     System.out.println("可以打电话");

 16   }

 17 }

 18 /**

 19  * 智能手机 

 20  */

 21 class SmartPhone implements Phone{

 22   private Phone nonSmartPhone;

 23   public SmartPhone(Phone nonSmartPhone){

 24     this.nonSmartPhone = nonSmartPhone;

 25   }

 26   //智能机拥有打电话和玩愤怒的小鸟的功能

 27   public void action() {

 28     nonSmartPhone.action();

 29     System.out.println("可以玩愤怒的小鸟"); // 在非智能机基础上,功能增强

 30   }

 31 }

 32 public class PhoneDemo {

 33   public static void main(String[] args) {

 34     Phone nPhone = new Non_SmartPhone(); 

 35     System.out.println("--------------手机装饰前--------------");

 36     nPhone.action();

 37     Phone smartPhone = new SmartPhone(nPhone);

 38     System.out.println("--------------手机装饰后--------------");

 39     smartPhone.action();

 40   }

 41 }

在例1中,Non_SmartPhone类表示非智能手机,它是属于被包装类,SmartPhone类表示智能手机,它是Non_SmartPhone类的包装类,Non_SmartPhone类和SmartPhone类实现了相同的接口Phone。第22行代码用于在SmartPhone类中持有被包装类Non_SmartPhone的对象,第29行代码用于在被包装类的基础上,实现功能的增强。

程序的运行结果如图1所示。

图1 运行结果

从图1中可以看出,SmartPhone对Non_SmartPhone类进行包装后,SmartPhone类型的对象不仅具有了“打电话”功能,还具有了“玩游戏”的功能。

点击此处
隐藏目录