成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

代理模式和裝飾者模式

NusterCache / 2703人閱讀

摘要:簡(jiǎn)介代理模式和裝飾者模式是兩種常見(jiàn)的設(shè)計(jì)模式。這里通過(guò)構(gòu)造函數(shù)的參數(shù)將被代理對(duì)象傳入到代理中,也可以通過(guò)其它方式,如提供一個(gè)方法。下面是的代碼輸出首先依然是先創(chuàng)建一個(gè)需要被代理的對(duì)象,然后把它傳入到的構(gòu)造函數(shù)中。

簡(jiǎn)介

代理模式和裝飾者模式是兩種常見(jiàn)的設(shè)計(jì)模式。代理模式是為其它對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問(wèn)。在某些情況下,一個(gè)對(duì)象不適合或者不能直接引用另一個(gè)對(duì)象,而代理對(duì)象可以在客戶端和目標(biāo)對(duì)象之間起到中介的作用。裝飾模式指的是在不必改變?cè)愇募褪褂美^承的情況下,動(dòng)態(tài)地?cái)U(kuò)展一個(gè)對(duì)象的功能。它是通過(guò)創(chuàng)建一個(gè)包裝對(duì)象,也就是裝飾者來(lái)包裹真實(shí)的對(duì)象。

因?yàn)檫@兩種模式比較相似,所以把它們放在一起做個(gè)比較與總結(jié)。

代理模式

代理模式包含代理對(duì)象和被代理對(duì)象,類圖如下:

代理對(duì)象 Proxy 和被代理對(duì)象 RealSubject 都繼承了 Subject 接口??蛻舳苏{(diào)用 Proxy 的方法,而 Proxy 則把具體操作委托給 RealSubject 執(zhí)行。下面是代碼實(shí)現(xiàn):

interface Subject {
    void doAction();
}

class RealSubject implements Subject {

    @Override
    public void doAction() {
        System.out.println("RealSubject#doAction");
    }
}

class Proxy implements Subject {
    private Subject subject;

    public Proxy(Subject subject) {
        this.subject = subject;
    }

    @Override
    public void doAction() {
        subject.doAction();
    }
}

public class Client {
    public static void main(String[] args) {
        Subject realSubject = new RealSubject();
        Subject proxy = new Proxy(realSubject);
        proxy.doAction();
    }
}

輸出:RealSubject#doAction

在 Client 中,首先創(chuàng)建了一個(gè) realSubject 對(duì)象,然后創(chuàng)建一個(gè)代理對(duì)象 proxy 并且把 realSubject
對(duì)象通過(guò)構(gòu)造器傳入進(jìn)去。最后調(diào)用代理對(duì)象的 doAction,實(shí)際執(zhí)行的是 realSubject 的對(duì)應(yīng)方法。這里通過(guò)構(gòu)造函數(shù)的參數(shù)將被代理對(duì)象傳入到代理中,也可以通過(guò)其它方式,如提供一個(gè) setSubject 方法。

上面的代理模式,代理對(duì)象和被代理對(duì)象需要實(shí)現(xiàn)相同的接口,所以如果要代理其它接口的對(duì)象需要寫(xiě)一個(gè)新的代理類。Java 提供了動(dòng)態(tài)代理的功能,可以簡(jiǎn)化我們的代碼。

動(dòng)態(tài)代理

動(dòng)態(tài)代理可以在運(yùn)行期生成所需要的代理對(duì)象,看下面的代碼:

class DynamicProxy implements InvocationHandler {
    // 被代理對(duì)象的引用
    private Object obj;

    public DynamicProxy(Object obj) {
        this.obj = obj;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result = method.invoke(obj, args);
        return result;
    }
}

DynamicProxy 實(shí)現(xiàn)了 InvocationHandler 接口,這個(gè)接口中有一個(gè) invoke 方法,被代理的對(duì)象的任何方法都是在 invoke 中調(diào)用。下面是 Client 的代碼:

public class TestDelegate {
    public static void main(String[] args) {
        Subject realSubject = new RealSubject();

        DynamicProxy dynamicProxy = new DynamicProxy(realSubject);
        ClassLoader loader = realSubject.getClass().getClassLoader();
        Subject proxy = (Subject) Proxy.newProxyInstance(loader, new Class[]{Subject.class}, dynamicProxy);

        proxy.doAction();
    }
}

輸出:RealSubject#doAction

首先依然是先創(chuàng)建一個(gè)需要被代理的對(duì)象 realSubject,然后把它傳入到 DynamicProxy 的構(gòu)造函數(shù)中。這個(gè) dynamicProxy 還不是我們需要的代理,畢竟它沒(méi)有實(shí)現(xiàn) Subject 接口。下面通過(guò) Proxy.newProxyInstance 創(chuàng)建了一個(gè) Subject 對(duì)象,也就是最終的代理對(duì)象。

通過(guò)動(dòng)態(tài)代理,創(chuàng)建一個(gè)實(shí)現(xiàn)了 InvocationHandler 接口的 DynamicProxy 類,通過(guò)這個(gè)類可以在運(yùn)行期為各種對(duì)象創(chuàng)建對(duì)應(yīng)的代理,比靜態(tài)代理方便了很多。

裝飾者模式

裝飾者模式是為了給已有的對(duì)象增加一些邏輯,但是不改變已有對(duì)象的代碼,下面是類圖:

從上圖可以看出,裝飾者 Decorator與需要被裝飾的對(duì)象 ContcreteComponent 實(shí)現(xiàn)了相同的接口。具體怎么裝飾則由 Decorator 的子類 ConcreteDecorator 決定。

Java 中使用裝飾者模式的一個(gè)典型的例子是 I/O 對(duì)象的創(chuàng)建,比如創(chuàng)建一個(gè) BufferedInputStream 時(shí):

InputStream in = ...
InputStream input = new BufferedInputStream(in);

BufferedInputStream 繼承于 FilterInputStream,這個(gè) FilterInputStream 相當(dāng)于裝飾者模式中的 Decorator,它繼承了 InputStream 接口。BufferedInputStream 則是一個(gè)具體的裝飾類,其它還有 DataInputStream 以及 ByteArrayInputStream 等。而傳給 BufferedInputstream 的對(duì)象 in 則是需要被裝飾者。裝飾者對(duì)被裝飾者進(jìn)行了功能的擴(kuò)展,但是又不需要修改被裝飾者的相應(yīng)代碼,符合“開(kāi)閉原則”,即對(duì)于修改是封閉的,對(duì)于擴(kuò)展則是開(kāi)放的。

如果是為了給某個(gè)類提供更多的功能,繼承是一種方案。但是,如果我們的功能有很多種組合,那么為每種組合編寫(xiě)一個(gè)繼承的類可能需要?jiǎng)?chuàng)建太多的子類。而裝飾者模式則可以解決這個(gè)問(wèn)題,只需要為每個(gè)功能編寫(xiě)一個(gè)裝飾類,在運(yùn)行時(shí)組合不同的對(duì)象即可實(shí)現(xiàn)所需的功能組合。

總結(jié)

代理模式和裝飾者模式有著很多的應(yīng)用,這兩者具有一定的相似性,都是通過(guò)一個(gè)新的對(duì)象封裝原有的對(duì)象。二者之間的差異在于代理模式是為了實(shí)現(xiàn)對(duì)象的控制,可能被代理的對(duì)象難以直接獲得或者是不想暴露給客戶端,而裝飾者模式是繼承的一種替代方案,在避免創(chuàng)建過(guò)多子類的情況下為被裝飾者提供更多的功能。

如果我的文章對(duì)您有幫助,不妨點(diǎn)個(gè)贊支持一下(^_^)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/68343.html

相關(guān)文章

  • JavaScript設(shè)計(jì)模式----裝飾模式

    摘要:聲明這個(gè)系列為閱讀設(shè)計(jì)模式與開(kāi)發(fā)實(shí)踐曾探著一書(shū)的讀書(shū)筆記裝飾者模式的定義裝飾者模式能夠在不改變對(duì)象自身的基礎(chǔ)上,在程序運(yùn)行期間給對(duì)像動(dòng)態(tài)的添加職責(zé)。與繼承相比,裝飾者是一種更輕便靈活的做法。裝飾者模式的作用就是為對(duì)象動(dòng)態(tài)的加入某些行為。 聲明:這個(gè)系列為閱讀《JavaScript設(shè)計(jì)模式與開(kāi)發(fā)實(shí)踐》 ----曾探@著一書(shū)的讀書(shū)筆記 裝飾者模式的定義: 裝飾者(decorator)模式能...

    rose 評(píng)論0 收藏0
  • 我的Java設(shè)計(jì)模式-代理模式

    摘要:下面總結(jié)了它倆的異同相同點(diǎn)都需要實(shí)現(xiàn)同一個(gè)接口或者繼承同一個(gè)抽象類,并且代理角色和裝飾角色都持有被代理角色和構(gòu)件角色的引用。 寫(xiě)完上一篇之后有小伙伴問(wèn)我有沒(méi)有寫(xiě)過(guò)代理模式,想看看我的理解。原本我的設(shè)計(jì)模式系列是按照創(chuàng)建型-行為型-結(jié)構(gòu)型的順序?qū)懴氯サ?,既然小伙伴誠(chéng)心誠(chéng)意了,我就大發(fā)慈悲的穿插一篇代理模式。開(kāi)玩笑,題外話。 說(shuō)起代理模式,就不由得想起經(jīng)紀(jì)人,說(shuō)起經(jīng)紀(jì)人,就想起了...對(duì),...

    BWrong 評(píng)論0 收藏0
  • 設(shè)計(jì)模式裝飾模式

    摘要:相關(guān)設(shè)計(jì)模式裝飾者模式和代理模式裝飾者模式關(guān)注再一個(gè)對(duì)象上動(dòng)態(tài)添加方法代理模式關(guān)注再對(duì)代理對(duì)象的控制訪問(wèn),可以對(duì)客戶隱藏被代理類的信息裝飾著模式和適配器模式都叫包裝模式關(guān)于新職責(zé)適配器也可以在轉(zhuǎn)換時(shí)增加新的職責(zé),但主要目的不在此。 0x01.定義與類型 定義:裝飾模式指的是在不必改變?cè)愇募褪褂美^承的情況下,動(dòng)態(tài)地?cái)U(kuò)展一個(gè)對(duì)象的功能。它是通過(guò)創(chuàng)建一個(gè)包裝對(duì)象,也就是裝飾來(lái)包裹真實(shí)的...

    chuyao 評(píng)論0 收藏0
  • JavaScript 設(shè)計(jì)模式(四):適配模式

    摘要:與其它模式的異同適配器模式不會(huì)改變?cè)薪涌?,這一點(diǎn)與裝飾者模式和代理模式類似。代理模式適配器模式與代理模式最相似,同樣都是創(chuàng)建一個(gè)新對(duì)象包裝一次,實(shí)現(xiàn)對(duì)本體的調(diào)用。外觀模式外觀模式與適配器模式最大的區(qū)別,是定義了一個(gè)新的接口。 showImg(https://segmentfault.com/img/bVbul8d?w=800&h=600); 適配器模式:將一個(gè)類(對(duì)象)的接口(方法或...

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

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

0條評(píng)論

閱讀需要支付1元查看
<