更新时间:2020年09月18日15时08分 来源:传智播客 浏览次数:
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中可以看出,SmartPhone对Non_SmartPhone类进行包装后,SmartPhone类型的对象不仅具有了“打电话”功能,还具有了“玩游戏”的功能。
猜你喜欢: