91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java中的裝飾器模式是什么

發布時間:2021-07-08 17:49:28 來源:億速云 閱讀:129 作者:chen 欄目:大數據

本篇內容介紹了“java中的裝飾器模式是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

1. 基本概念

裝飾器模式(Decorator),又名包裝(Wrapper)模式。允許向一個現有的對象添加新的功能同時又不改變其結構。這種類型的設計模式屬于結構型模式,它是作為現有的類的一個包裝。
這種模式創建了一個裝飾類,用來包裝原有的類,并在保持類方法簽名完整性的前提下,提供了額外的功能。

2. 使用場景

2.1 HttpServletRequestWrapper

/**
 * Provides a convenient implementation of the HttpServletRequest interface that
 * can be subclassed by developers wishing to adapt the request to a Servlet.
 * This class implements the Wrapper or Decorator pattern. Methods default to
 * calling through to the wrapped request object.
 *
 * @see javax.servlet.http.HttpServletRequest
 * @since v 2.3
 */
public class HttpServletRequestWrapper extends ServletRequestWrapper implements
        HttpServletRequest {

    /**
     * Constructs a request object wrapping the given request.
     *
     * @param request The request to wrap
     *
     * @throws java.lang.IllegalArgumentException
     *             if the request is null
     */
    public HttpServletRequestWrapper(HttpServletRequest request) {
        super(request);
    }
}

HttpServletRequestWrapper是一個什么都沒做的具體裝飾實現類(concerteDecorator),不過它即繼承了裝飾實現類,又實現了HttpservletRequst。這里什么都不做是有道理的,因為要對請求添加何種功能事先是沒法知道的,不可能盲目的添加。所以,這種里的裝飾模式的應用場景:適合對默認目標實現未知或者不易擴展的情況。
裝飾模式是在不必改變原類文件和使用繼承的情況下,動態的擴展一個對象的功能。它是通過創建一個包裝對象,也就是裝飾來包裹真實的對象。那么在實際應用中遇到需增強對象的方法時,到底選用哪種方式比較好呢?這個沒有具體的定式,只能是根據具體的需求來采用具體的方式,不過有一種情況下,必須使用Decorator設計模式:即被增強的對象,開發人員只能得到它的對象,無法得到它的class文件
比如request、response對象,開發人員之所以在servlet中能通過sun公司定義的HttpServletRequest/Response接口去操作這些對象,是因為Tomcat服務器廠商編寫了request、response接口的實現類。web服務器在調用servlet時,會用這些接口的實現類創建出對象,然后傳遞給servlet程序。此種情況下,由于開發人員根本不知道服務器廠商編寫的request、response接口的實現類是哪個?在程序中只能拿到服務器廠商提供的對象,因此就只能采用Decorator設計模式對這些對象進行增強。

當我們在使用filter的時候卻會發現至少有一半的時間我們都想改變HttpServletRequest對象的參數。如:用filter在HttpServletRequest對象到達Servlet之前將用戶輸入的空格去掉。但是由于java.util.Map包裝的HttpServletRequest對象的參數是不可改變的,那要怎么辦呢?幸運的是,盡管我們不能改變對象本身但是可以通過裝飾器來改變其狀態。想要改變HttpServletRequest中的參數,可以通過HttpServletRequest的裝飾類HttpServletRequestWrapper來實現,只需要在裝飾類中按照需要重寫其getParameter(getParameterValues)方法即可。

2.2 ServerWebExchangeDecorator

WebFlux中采用的裝飾器,原理類似,可以對請求和響應參數進行修改(注意直接在過濾器中修改處于安全考慮會拋出異常UnsupportedOperationException,具體解決可以參考xbuba.com-如何在Spring WebFilter中添加自定義標頭?)。

/**
 * A convenient base class for classes that need to wrap another
 * {@link ServerWebExchange}. Pre-implements all methods by delegating to the
 * wrapped instance.
 *
 * <p><strong>Note:</strong> if the purpose for using a decorator is to override
 * properties like {@link #getPrincipal()}, consider using
 * {@link ServerWebExchange#mutate()} instead.
 *
 * @author Rossen Stoyanchev
 * @since 5.0
 *
 * @see ServerWebExchange#mutate()
 */
public class ServerWebExchangeDecorator implements ServerWebExchange {

	private final ServerWebExchange delegate;


	protected ServerWebExchangeDecorator(ServerWebExchange delegate) {
		Assert.notNull(delegate, "ServerWebExchange 'delegate' is required.");
		this.delegate = delegate;
	}
}
/**
 * Wraps another {@link ServerHttpRequest} and delegates all methods to it.
 * Sub-classes can override specific methods selectively.
 *
 * @author Rossen Stoyanchev
 * @since 5.0
 */
public class ServerHttpRequestDecorator implements ServerHttpRequest {

	private final ServerHttpRequest delegate;


	public ServerHttpRequestDecorator(ServerHttpRequest delegate) {
		Assert.notNull(delegate, "Delegate is required");
		this.delegate = delegate;
	}
}

“java中的裝飾器模式是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

天台县| 昆明市| 凌云县| 潢川县| 康马县| 石泉县| 樟树市| 三穗县| 临泽县| 白山市| 泽普县| 永嘉县| 高州市| 久治县| 汾阳市| 梅河口市| 陵水| 德安县| 寿光市| 巴里| 炎陵县| 门头沟区| 扎赉特旗| 顺义区| 米易县| 新营市| 望都县| 扎鲁特旗| 新郑市| 泸溪县| 辽阳市| 大足县| 长葛市| 双城市| 疏附县| 来宾市| 罗平县| 松溪县| 青川县| 蒙阴县| 诏安县|