更新時間:2020年09月18日15時08分 來源:傳智播客 瀏覽次數(shù):
HttpServletRequestWrapper和HttpServletResponseWrapper作為request和response對象的包裝類,它們都采用了裝飾設(shè)計模式。所謂裝飾設(shè)計模式,指的是通過包裝類的方式,動態(tài)增強某個類的功能。為了大家更好的理解裝飾設(shè)計模式,接下來,先來簡單介紹一下裝飾設(shè)計模式的特點,具體如下:
● 包裝類要和被包裝對象實現(xiàn)同樣的接口。
● 包裝類持有一個被包裝對象,例如在HttpServletRequestWrapper定義的構(gòu)造方法中,需要傳遞一個HttpServletRequest類型的參數(shù)。
● 包裝類在實現(xiàn)接口的過程中,對于不需要包裝的方法原封不動地調(diào)用被包裝對象的方法來實現(xiàn),對于需要包裝的方法自己實現(xiàn)。
了解了裝飾設(shè)計模式的特點,接下來,通過一個案例來演示如何實現(xiàn)裝飾設(shè)計模式,在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("可以玩憤怒的小鳥"); // 在非智能機基礎(chǔ)上,功能增強
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類實現(xiàn)了相同的接口Phone。第22行代碼用于在SmartPhone類中持有被包裝類Non_SmartPhone的對象,第29行代碼用于在被包裝類的基礎(chǔ)上,實現(xiàn)功能的增強。
程序的運行結(jié)果如圖1所示。
從圖1中可以看出,SmartPhone對Non_SmartPhone類進行包裝后,SmartPhone類型的對象不僅具有了“打電話”功能,還具有了“玩游戲”的功能。
猜你喜歡: