制作程序化装饰花纹图案_装饰图案
制作程序化裝飾花紋圖案
裝飾圖案
我不經常使用的一種設計模式是Decorator 。 我不確定為什么這種模式不受歡迎,因為它很方便。 裝飾器模式允許以受控方式向對象添加功能。 即使在使用靜態類型的語言時,也可以在運行時運行! 裝飾器模式是子類的替代方法。 子類化會在編譯時添加行為,并且更改會影響原始類的所有實例; 裝飾可以在運行時為單個對象提供新的行為。 裝飾器模式是遵守開放/關閉原則的好工具。
一些示例可能顯示此模式的價值:
示例1:HTTP身份驗證
想象一下一個HTTP客戶端,例如與RESTful服務對話的客戶端。
該服務的某些部分可公開訪問,但某些部分需要用戶登錄。當客戶端嘗試訪問受保護的資源時,RESTful服務以401 Unauthorized狀態碼響應。
更改客戶端以處理401會導致重復,因為每個調用都可能需要身份驗證 。 因此,我們應該將身份驗證代碼提取到一個位置。 但是那個地方在哪里?
這是Decorator模式出現的地方:
public class AuthenticatingHttpClientimplements HttpClient {private final HttpClient wrapped;public AuthenticatingHttpClient(HttpClient wrapped) {this.wrapped = wrapped;}@Overridepublic Response execute(Request request) {Response response = wrapped.execute(request);if (response.getStatusCode() == 401) {authenticate();response = wrapped.execute(request);}return response;}protected void authenticate() {// ...}}REST客戶端現在不再需要擔心身份驗證,因為AuthenticatingHttpClient處理AuthenticatingHttpClient 。
示例2:緩存授權決策
OK,因此用戶已登錄,REST服務器知道她的身份。 它可能決定允許一個人訪問某個資源,但不允許另一個人訪問。
IOW,它可能使用XACML來實現授權 。 在這種情況下, 策略決策點 (PDP)負責決定訪問請求。
檢查權限通常很昂貴,尤其是當權限變得更細粒度并且訪問策略更加復雜時。 由于訪問策略通常不會經常更改,因此這是緩存的理想選擇。
這是裝飾器模式可能派上用場的另一個實例:
public class CachingPdp implements Pdp {private final Pdp wrapped;public CachingPdp(Pdp wrapped) {this.wrapped = wrapped;}@Overridepublic ResponseContext decide(RequestContext request) {ResponseContext response = getCached(request);if (response == null) {response = wrapped.decide(request);cache(request, response);}return response;}protected ResponseContext getCached(RequestContext request) {// ...}protected void cache(RequestContext request, ResponseContext response) {// ...}}如您所見,代碼與第一個示例非常相似,這就是為什么我們將其稱為模式。
正如您可能從這兩個示例中猜到的那樣,Decorator模式對于實現跨領域的關注點確實非常有用,例如身份驗證,授權和審計的安全功能,但這肯定不是唯一的亮點。
如果您仔細看,我相信您將能夠發現更多使這種模式起作用的機會。
翻譯自: https://www.javacodegeeks.com/2014/01/the-decorator-pattern.html
制作程序化裝飾花紋圖案
總結
以上是生活随笔為你收集整理的制作程序化装饰花纹图案_装饰图案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓选股软件(安卓选股)
- 下一篇: 6个您需要了解的日志管理工具(以及如何使