摘要:深入剖析,第二章。如果給方法以默認(rèn)訪問權(quán)限,則只能在同一個(gè)包中訪問,這個(gè)被認(rèn)為是可以的,但是不最好,最優(yōu)雅的方式是通過類。定義外觀模式,為子系統(tǒng)中的一組接口提供一個(gè)一致的界面,此模式定義了一個(gè)高層接口,這個(gè)接口使得這一子系統(tǒng)更加容易使用。
《深入剖析Tomcat》(How Tomcat Works),第二章。
創(chuàng)建 Request 和 Response 分別實(shí)現(xiàn) ServletRequest 和 ServletResponse,然后將這兩個(gè)對(duì)象傳給實(shí)現(xiàn)了 Servlet 接口的 PrimitiveServlet 類的service方法。
下面代碼中的 request 和 response 除了實(shí)現(xiàn) ServletRequest 和 ServletResponse 接口中的方法,還分別自定義了 getUri 和 sendStaticResource 方法,如果將他們向上轉(zhuǎn)為 ServletRequest 和 ServletResponse,那么在 PrimitiveServlet 中如果被向下轉(zhuǎn)為 Request 和 Response,則可以調(diào)用 getUri 和 sendStaticResource 方法,這被認(rèn)為是不安全的。
Request request = ... Response response = ... servlet = (Servlet) myClass.newInstance(); servlet.service((ServletRequest) request, (ServletResponse) response);
如果將 getUri 和 sendStaticResource 聲明為私有,則可以防止在 servlet 中被調(diào)用,但是在其他可能被安全地調(diào)用的地方也不能用了,不可以。如果給方法以默認(rèn)訪問權(quán)限,則只能在同一個(gè)包中訪問,這個(gè)被認(rèn)為是可以的,但是不最好,最優(yōu)雅的方式是通過 facade 類。
具體做法是定義 RequestFacade 和 ResponseFacade 兩個(gè)類,分別實(shí)現(xiàn) ServletRequest 和 ServletResponse,同時(shí)定義私有成員變量 Request 和 Response,并且方法的實(shí)現(xiàn)調(diào)用 Request 和 Response 的實(shí)現(xiàn)。然后,將 RequestFacade 和 ResponseFacade 上轉(zhuǎn)為 ServletRequest 和 ServletResponse 傳給 servlet 的 service 方法,這樣即使在 servlet 中被下轉(zhuǎn)為 RequestFacade 和 ResponseFacade,也不能訪問私有成員變量對(duì)象中的方法。既用了 Request 和 Response 的實(shí)現(xiàn),又能防止其中自定義的方法被不合理的訪問。
類圖如下:
代碼:
public class RequestFacade implements ServletRequest { private ServleLRequest request = null; public RequestFacade(Request request) { this.request = request; } /* implementation of the ServletRequest*/ public Object getAttribute(String attribute) { return request.getAttribute(attribute); } ... } // ResponseFacade類似 RequestFacade requestFacade = new RequestFacade(request); ResponseFacade responseFacade = new ResponseFacade(response); try { servlet = (Servlet) myClass.newInstance(); servlet.service((ServletRequest) requestFacade,(ServletResponse)responseFacade); }
下面是Facade模式的一些內(nèi)容,與上面的用法不太一樣。
定義
外觀模式(Facade),為子系統(tǒng)中的一組接口提供一個(gè)一致的界面,此模式定義了一個(gè)高層接口,這個(gè)接口使得這一子系統(tǒng)更加容易使用。[DP]
以下來自維基百科
The facade pattern is typically used when:(外觀模式的典型用法)
a simple interface is required to access a complex system; (需要簡單的接口去訪問復(fù)雜的系統(tǒng))
the abstractions and implementations of a subsystem are tightly coupled;(子系統(tǒng)的抽象和實(shí)現(xiàn)是緊密耦合的)
need an entry point to each level of layered software; or(需要一個(gè)入口去訪問分層軟件的每一層)
a system is very complex or difficult to understand.(一個(gè)復(fù)雜的,難以理解的系統(tǒng))
大話設(shè)計(jì)模式中基金與股票的例子挺好的,這幅圖也很好:
下面是維基百科上的示例代碼,Java版:
/* Complex parts */ class CPU { public void freeze() { ... } public void jump(long position) { ... } public void execute() { ... } } class Memory { public void load(long position, byte[] data) { ... } } class HardDrive { public byte[] read(long lba, int size) { ... } } /* Facade */ class ComputerFacade { private CPU processor; private Memory ram; private HardDrive hd; public ComputerFacade() { this.processor = new CPU(); this.ram = new Memory(); this.hd = new HardDrive(); } public void start() { processor.freeze(); ram.load(BOOT_ADDRESS, hd.read(BOOT_SECTOR, SECTOR_SIZE)); processor.jump(BOOT_ADDRESS); processor.execute(); } } /* Client */ class You { public static void main(String[] args) { ComputerFacade computer = new ComputerFacade(); computer.start(); } }
參考:
維基百科:https://en.wikipedia.org/wiki...
大話設(shè)計(jì)模式第12章 外觀模式
How Tomcat Works, 第二章
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/66046.html
摘要:本文來自原文鏈接歡迎作客我們的學(xué)習(xí)群該篇屬于底層核心技術(shù)實(shí)戰(zhàn)揭秘這一課程底層核心概念解析這一章的擴(kuò)展閱讀。考慮到學(xué)員們的基礎(chǔ)差異,為了避免視頻當(dāng)中過于詳細(xì)而連篇累牘,故將一些底層實(shí)現(xiàn)相關(guān)的知識(shí)點(diǎn)以文章形式呈現(xiàn),供大家預(yù)習(xí)和隨時(shí)查閱。 本文來自pilishen.com----原文鏈接; 歡迎作客我們的php&Laravel學(xué)習(xí)群:109256050該篇屬于《Laravel底層核心技術(shù)實(shí)戰(zhàn)...
摘要:適配器是將接口轉(zhuǎn)換為不同接口,而外觀模式是提供一個(gè)統(tǒng)一的接口來簡化接口。 外觀模式(Facade Pattern)屬于結(jié)構(gòu)型模式的一種,為子系統(tǒng)中的一組接口提供一個(gè)統(tǒng)一的入口,它通過引入一個(gè)外觀角色來簡化客戶端與子系統(tǒng)之間的交互... 概述 外觀模式是一種使用頻率非常高的結(jié)構(gòu)型設(shè)計(jì)模式,當(dāng)你要為一個(gè)復(fù)雜子系統(tǒng)提供一個(gè)簡單接口時(shí)。子系統(tǒng)往往因?yàn)椴粩嘌莼兊迷絹碓綇?fù)雜。大多數(shù)模式使用時(shí)...
摘要:外觀設(shè)計(jì)模式的優(yōu)點(diǎn)易于使用在實(shí)現(xiàn)形式上通常占用較小的內(nèi)存。抽象的注意事項(xiàng)外觀設(shè)計(jì)模式雖然少有劣勢,但值得注意的一個(gè)問題是性能。 當(dāng)我們豎起一個(gè)門面時(shí),我們向外展示的只是一種外表,它可能隱藏著一個(gè)非同一般的事實(shí)。這也就是我們所要說的外觀設(shè)計(jì)模式,這種模式為一大段的代碼體提供了一個(gè)便捷的高級(jí)接口,隱藏了底層復(fù)雜的實(shí)現(xiàn)。這種設(shè)計(jì)模式簡化代碼的呈現(xiàn)形式,給開發(fā)人員一個(gè)API,同時(shí)也能提高代碼的...
摘要:外觀模式的目的在于降低系統(tǒng)的復(fù)雜程度。在不引入抽象外觀類的情況下,增加新的子系統(tǒng)可能需要修改外觀類或客戶端的源代碼,違背了開閉原則。 外觀模式 外觀模式(Facade Pattern):外部與一個(gè)子系統(tǒng)的通信必須通過一個(gè)統(tǒng)一的外觀對(duì)象進(jìn)行,為子系統(tǒng)中的一組接口提供一個(gè)一致的界面,外觀模式定義了一個(gè)高層接口,這個(gè)接口使得這一子系統(tǒng)更加容易使用。外觀模式又稱為門面模式,它是一種對(duì)象結(jié)構(gòu)型模...
閱讀 825·2019-08-30 15:55
閱讀 1406·2019-08-30 13:55
閱讀 1983·2019-08-29 17:13
閱讀 2840·2019-08-29 15:42
閱讀 1331·2019-08-26 14:04
閱讀 1016·2019-08-26 13:31
閱讀 3271·2019-08-26 11:34
閱讀 828·2019-08-23 18:25