国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

外觀模式(Facade Pattern)

LMou / 1121人閱讀

摘要:深入剖析,第二章。如果給方法以默認(rèn)訪問權(quán)限,則只能在同一個(gè)包中訪問,這個(gè)被認(rèn)為是可以的,但是不最好,最優(yōu)雅的方式是通過類。定義外觀模式,為子系統(tǒng)中的一組接口提供一個(gè)一致的界面,此模式定義了一個(gè)高層接口,這個(gè)接口使得這一子系統(tǒng)更加容易使用。

《深入剖析Tomcat》(How Tomcat Works),第二章。

創(chuàng)建 RequestResponse 分別實(shí)現(xiàn) ServletRequestServletResponse,然后將這兩個(gè)對(duì)象傳給實(shí)現(xiàn)了 Servlet 接口的 PrimitiveServlet 類的service方法。

下面代碼中的 request 和 response 除了實(shí)現(xiàn) ServletRequestServletResponse 接口中的方法,還分別自定義了 getUri 和 sendStaticResource 方法,如果將他們向上轉(zhuǎn)為 ServletRequestServletResponse,那么在 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

相關(guān)文章

  • PHP中的facade pattern外觀模式

    摘要:本文來自原文鏈接歡迎作客我們的學(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)...

    jaysun 評(píng)論0 收藏0
  • 一起學(xué)設(shè)計(jì)模式 - 外觀模式

    摘要:適配器是將接口轉(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í)...

    zone 評(píng)論0 收藏0
  • 外觀設(shè)計(jì)模式

    摘要:外觀設(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í)也能提高代碼的...

    zzbo 評(píng)論0 收藏0
  • Laravel核心解讀 -- 外觀模式

    摘要:外觀模式的目的在于降低系統(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)型模...

    zoomdong 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

LMou

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<