成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

我的Java設(shè)計(jì)模式-代理模式

BWrong / 3218人閱讀

摘要:下面總結(jié)了它倆的異同相同點(diǎn)都需要實(shí)現(xiàn)同一個(gè)接口或者繼承同一個(gè)抽象類(lèi),并且代理角色和裝飾角色都持有被代理角色和構(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ì),沒(méi)錯(cuò)就是“許三多”。這就有點(diǎn)邪惡了~甭八卦了,入正題。

經(jīng)紀(jì)人的角色就相當(dāng)于一個(gè)代理,要找到明星就先經(jīng)過(guò)經(jīng)紀(jì)人,經(jīng)紀(jì)人負(fù)責(zé)給明星接拍電影把關(guān)、活動(dòng)撈金,這就是為什么要用到代理的原因,拋開(kāi)其他繁瑣的事務(wù),專(zhuān)注被代理人的業(yè)務(wù)邏輯,減輕被代理人的負(fù)擔(dān)。so,帶著一點(diǎn)點(diǎn)罪惡感來(lái)看看什么是代理模式。

一、代理模式 定義

??為其它對(duì)象提供一個(gè)代理對(duì)象,并由代理對(duì)象控制這個(gè)對(duì)象的訪問(wèn)。

特點(diǎn)

1)很直接的,實(shí)現(xiàn)同一個(gè)接口或者繼承同一個(gè)抽象類(lèi)。

2)代理對(duì)象控制對(duì)被代理對(duì)象的訪問(wèn)。

UML

這是代理模式的通用UML,涉及到的角色如下所示:

??- 抽象主題角色:定義了被代理角色和代理角色的共同接口或者抽象類(lèi)。

??- 被代理角色:實(shí)現(xiàn)或者繼承抽象主題角色,定義實(shí)現(xiàn)具體業(yè)務(wù)邏輯的實(shí)現(xiàn)。

??- 代理角色:實(shí)現(xiàn)或者繼承抽象主題角色,持有被代理角色的引用,控制和限制被代理角色的實(shí)現(xiàn),并且擁有自己的處理方法(預(yù)處理和善后)

二、代理模式實(shí)戰(zhàn)

首先是抽象主題角色:

public interface Subject {
    public void movie();
}

很簡(jiǎn)單,單純定義了movie方法,下面看被代理角色的實(shí)現(xiàn):

public class Star implements Subject {
    @Override
    public void movie() {
        System.out.println(getClass().getSimpleName() + ":經(jīng)紀(jì)人接了一部電影,我負(fù)責(zé)拍就好");
    }
}

被代理角色實(shí)現(xiàn)抽象主題角色,專(zhuān)注實(shí)現(xiàn)被代理角色的業(yè)務(wù)邏輯。繼續(xù)看代理角色:

public class Agent implements Subject {
    private Subject star;

    public Agent(Subject star) {
        this.star = star;
    }

    @Override
    public void movie() {
        System.out.println(getClass().getSimpleName() + ":劇本很好,這部電影接下了");
        star.movie();
    }
}

代理角色持有被代理角色的引用,要訪問(wèn)被代理角色必須通過(guò)代理,負(fù)責(zé)被代理角色本職之外的職能,并且具有準(zhǔn)入和過(guò)濾的功能。最后來(lái)看客戶(hù)端的實(shí)現(xiàn):

public class Client {
    public static void main(String[] args) {
        Subject star = new Star();
        Subject proxy = new Agent(star);
        proxy.movie();
    }
}

表面上是調(diào)用了代理的方法,實(shí)際的執(zhí)行者其實(shí)是被代理角色Star,看看結(jié)果就知道:

Agent:劇本很好,這部電影接下了
Star:經(jīng)紀(jì)人接了一部電影,我負(fù)責(zé)拍就好

上面是代理模式其中的一種實(shí)現(xiàn)方式,主要在代理角色Agent中指定了被代理角色Star,意思是經(jīng)紀(jì)人大喊一聲“嘿~兄弟,你是我的了!”。

下面看代理模式的另一種實(shí)現(xiàn)方式,先看抽象主題角色代碼:

public interface Subject {
    public void movie();
    
    // 指定代理
    public Subject getAgent();
}

增加了指定代理的方法getAgent,再來(lái)看被代理角色和代理角色代碼:

// 被代理角色
public class Star implements Subject {
    @Override
    public void movie() {
        System.out.println(getClass().getSimpleName() + ":經(jīng)紀(jì)人接了一部電影,我負(fù)責(zé)拍就好");
    }

    @Override
    public Subject getAgent() {
        return new Agent(this);
    }
}

// 代理角色
public class Agent implements Subject {
    private Subject star;

    public Agent(Subject star) {
        this.star = star;
    }

    @Override
    public void movie() {
        System.out.println(getClass().getSimpleName() + ":劇本題材很好,這部電影接下了");
        star.movie();
    }

    @Override
    public Subject getAgent() {
        return this;
    }
}

重點(diǎn)看被代理角色getAgent方法,方法里面指定了Agent為代理,而Agent的getAgent并沒(méi)有指定代理。下面看客戶(hù)端代碼實(shí)現(xiàn):

public class Client {
    public static void main(String[] args) {
        Subject star = new Star();
        Subject proxy = star.getAgent();
        proxy.movie();
    }
}

在客戶(hù)端通過(guò)getAgent得到指定代理角色,由代理來(lái)控制star對(duì)象。

運(yùn)行的結(jié)果的跟上一種方式是一樣的。注意,這種方式是客戶(hù)端直接訪問(wèn)被代理角色,代理由被代理角色指定。前面的一種方式則是客戶(hù)端不能訪問(wèn)直接訪問(wèn)被代理角色,只能訪問(wèn)代理。但是,無(wú)論是哪一種方式,代理模式的實(shí)現(xiàn)都是必須經(jīng)過(guò)代理才能訪問(wèn)被代理模式。就比如明星拍電影,不會(huì)跳過(guò)經(jīng)紀(jì)人直接找到明星,而是經(jīng)過(guò)經(jīng)紀(jì)人再到明星,要不然經(jīng)紀(jì)人這個(gè)職位豈不是浪費(fèi)了。

三、代理模式擴(kuò)展 代理模式VS裝飾者模式

代理模式在講解了,接下來(lái)看裝飾者模式,先搞一張裝飾者模式的UML圖

別坑我讀的書(shū)少,這明明就是代理模式的UML。沒(méi)錯(cuò),裝飾者模式和代理模式就是這么相似,包括UML和代碼實(shí)現(xiàn),甚至可以是一模一樣。不信?來(lái)看裝飾者模式的代碼,這里我只給出簡(jiǎn)單代碼:

// 抽象構(gòu)件
public interface Component {    
    public void movie();    
}

// 具體構(gòu)件,實(shí)現(xiàn)Component,要被裝飾的
public class Star implements Component {
    @Override
    public void movie() {
        System.out.println(getClass().getSimpleName() + ":化了妝迷倒一片妹紙,拍起來(lái)電影特別帶勁");
    }
}

// 裝飾者,裝飾具體構(gòu)件
public class ConcreteDecorator implements Component {
    private Component star;

    public ConcreteDecorator(Component concreteComponent) {
        this.star = concreteComponent;
    }

    @Override
    public void movie() {
        System.out.println(getClass().getSimpleName() + ":拍電影各種道具加身,還得化妝");
        star.movie();
    }
}

public class Client {    
    public static void main(String[] args) {
        Subject star = new Star();
        Subject proxy = new Agent(star);
        proxy.movie();
    }
}

運(yùn)行客戶(hù)端代碼,結(jié)果如下:

ConcreteDecorator:拍電影各種道具加身,還得化妝
Star:化了妝迷倒一片妹紙,拍起來(lái)電影特別帶勁

哈哈哈哈,傻傻的分不清是裝飾者還是代理模式了吧!UML一樣,就算代碼的實(shí)現(xiàn)也可以一樣,就把結(jié)果改了改。下面總結(jié)了它倆的異同:

相同點(diǎn)

都需要實(shí)現(xiàn)同一個(gè)接口或者繼承同一個(gè)抽象類(lèi),并且代理角色和裝飾角色都持有被代理角色和構(gòu)件角色的引用。

兩種模式都可以在被代理角色和具體構(gòu)件角色的業(yè)務(wù)方法前后添加自己的方法。額...說(shuō)了等于沒(méi)說(shuō)。

不同點(diǎn)

代理模式重點(diǎn)在于控制對(duì)象的行為,而裝飾模式側(cè)重于增加對(duì)象的職能(當(dāng)然也可以削弱)。看完這句話立馬暈菜,到底是怎么才叫控制行為和增加職能?設(shè)計(jì)模式離不開(kāi)面對(duì)對(duì)象思想,用面向?qū)ο蟮乃枷胨伎歼@個(gè)問(wèn)題。代理模式是對(duì)整個(gè)對(duì)象的行為控制和限制,而非針對(duì)功能,跟裝飾模式不一樣,裝飾模式針對(duì)的是對(duì)象職能上的加強(qiáng),也就是屬性或者方法。

通俗的講,它們倆根本的區(qū)別是目的性不一樣,也就是使用場(chǎng)景。比如公司老板,為了更好的管理公司會(huì)請(qǐng)做行政、財(cái)務(wù)的人回來(lái)幫忙處理公司事務(wù),把事情整理好了,有必要的事情才到達(dá)老板那,這就是代理。如果是裝飾呢,就是往老板身上加職能,不僅提供財(cái)力,還要懂行政管理,財(cái)務(wù)會(huì)計(jì),甚至要會(huì)敲代碼,可以這么做,但并不符合實(shí)際使用場(chǎng)景。

四、代理模式的優(yōu)缺點(diǎn) 優(yōu)點(diǎn)

1)良好的擴(kuò)展性。修改被代理角色并不影響調(diào)用者使用代理,對(duì)于調(diào)用者,被代理角色是透明的。

2)隔離,降低耦合度。代理角色協(xié)調(diào)調(diào)用者和被代理角色,被代理角色只需實(shí)現(xiàn)本身關(guān)心的業(yè)務(wù),非自己本職的業(yè)務(wù)通過(guò)代理處理和隔離。

缺點(diǎn)

1)增加了代理類(lèi),實(shí)現(xiàn)需要經(jīng)過(guò)代理,因此請(qǐng)求速度會(huì)變慢。

總結(jié)

代理模式有靜態(tài)和動(dòng)態(tài)兩種方式,這篇文章的代理模式都是使用靜態(tài)代理,動(dòng)態(tài)代理在往后設(shè)計(jì)模式的擴(kuò)展會(huì)補(bǔ)上。這里不講解動(dòng)態(tài)代理首先是因?yàn)橹攸c(diǎn)在于把代理模式核心闡述清楚,再者是動(dòng)態(tài)代理用到的篇幅會(huì)較長(zhǎng),所以放到之后靜態(tài)代理和動(dòng)態(tài)代理的對(duì)比擴(kuò)展一起講解比較合適。另外,注意代理模式和裝飾者模式的區(qū)別,從網(wǎng)上看到了一堆相關(guān)的資料,有的說(shuō)是構(gòu)造方法不同,有的就直接拋出一句控制行為和增加職能虛無(wú)縹緲的闡述,都沒(méi)有說(shuō)清兩者的區(qū)別,看完后還是一臉的懵。這篇文章我給出了自己的它倆見(jiàn)解,有不同看法的小伙伴也可以給我意見(jiàn)。下一篇模板方法模式,您的點(diǎn)贊和關(guān)注是我的動(dòng)力哦,see you!

更多精彩干貨關(guān)注“AndroidJet的開(kāi)發(fā)之路”公眾號(hào)

設(shè)計(jì)模式Java源碼GitHub下載https://github.com/jetLee92/DesignPattern

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/71150.html

相關(guān)文章

  • 給女朋友講解什么是代理模式

    摘要:受知乎文章和設(shè)計(jì)模式之禪的啟發(fā),我也來(lái)搞一篇腦洞小開(kāi)的文章由標(biāo)題可知,這篇文章是寫(xiě)給我女朋友看的。于是這就讓經(jīng)紀(jì)人對(duì)粉絲說(shuō)只有萬(wàn),我才會(huì)寫(xiě)代碼。 前言 只有光頭才能變強(qiáng) 回顧前面: ThreadLocal就是這么簡(jiǎn)單 多線程三分鐘就可以入個(gè)門(mén)了! 多線程基礎(chǔ)必要知識(shí)點(diǎn)!看了學(xué)習(xí)多線程事半功倍 Java鎖機(jī)制了解一下 AQS簡(jiǎn)簡(jiǎn)單單過(guò)一遍 Lock鎖子類(lèi)了解一下 線程池你真不來(lái)了解一下...

    stormgens 評(píng)論0 收藏0
  • java動(dòng)態(tài)代理及RPC框架介紹

    摘要:這種語(yǔ)法,在中被稱(chēng)為動(dòng)態(tài)代理。在動(dòng)態(tài)代理機(jī)制中,這個(gè)角色只能是接口。動(dòng)態(tài)代理就是實(shí)現(xiàn)的技術(shù)之一。 所謂動(dòng)態(tài)代理,指的是語(yǔ)言提供的一種語(yǔ)法,能夠?qū)?duì)對(duì)象中不同方法的調(diào)用重定向到一個(gè)統(tǒng)一的處理函數(shù)中來(lái)。python重寫(xiě)__getattr__函數(shù)能夠做到這一點(diǎn),就連世界上最好的語(yǔ)言也提供稱(chēng)為魔術(shù)方法的__call。這種語(yǔ)法除了能更好的實(shí)現(xiàn)動(dòng)態(tài)代理外,還是RPC框架實(shí)現(xiàn)原理的一部分。 動(dòng)態(tài)代理...

    2shou 評(píng)論0 收藏0
  • java | 什么是動(dòng)態(tài)代理?

    摘要:代理模式在我們?nèi)粘V泻艹R?jiàn),生活處處有代理看張學(xué)友的演唱會(huì)很難搶票,可以找黃牛排隊(duì)買(mǎi)嫌出去吃飯麻煩,可以叫外賣(mài)無(wú)論是黃牛外賣(mài)騎手都得幫我們干活。靜態(tài)代理我還是以找黃牛幫我排隊(duì)買(mǎi)張學(xué)友的演唱會(huì)門(mén)票的例子,寫(xiě)個(gè)說(shuō)明。 微信公眾號(hào):一個(gè)優(yōu)秀的廢人。如有問(wèn)題,請(qǐng)后臺(tái)留言,反正我也不會(huì)聽(tīng)。 最近在復(fù)習(xí) Java 相關(guān),回顧了下代理模式。代理模式在 Java 領(lǐng)域很多地方都有應(yīng)用,它分為靜態(tài)代理和...

    fxp 評(píng)論0 收藏0
  • 100行代碼讓您學(xué)會(huì)JavaScript原生的Proxy設(shè)計(jì)模式

    摘要:面向?qū)ο笤O(shè)計(jì)里的設(shè)計(jì)模式之代理模式,相信很多朋友已經(jīng)很熟悉了。代表當(dāng)前執(zhí)行方法的實(shí)例,即方法調(diào)用者。代表具體的方法名稱(chēng)。現(xiàn)在我們?cè)俅握{(diào)用,傳入構(gòu)造器返回的代理對(duì)象打印輸出,代理邏輯生效了和的一樣優(yōu)雅地實(shí)現(xiàn)了代理設(shè)計(jì)模式。 showImg(https://segmentfault.com/img/remote/1460000016760603);面向?qū)ο笤O(shè)計(jì)里的設(shè)計(jì)模式之Proxy(代理...

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

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

0條評(píng)論

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