装饰设计模式
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类型的对象不仅具有了“打电话”功能,还具有了“玩游戏”的功能。