實(shí)例講解Java設(shè)計(jì)模式編程中如何運(yùn)用代理模式
定義:
Provide a surrogate or placeholder for another object to control access to it.
為其他對(duì)象一種代理以控制對(duì)這個(gè)對(duì)象的訪問(wèn)。
一般描述:
一般包含的三個(gè)角色:抽象主題、具體主題、代理主題。
- 抽象主題:是一個(gè)抽象類或接口,是一個(gè)普通的業(yè)務(wù)類型定義。
- 具體主題:業(yè)務(wù)邏輯的具體執(zhí)行者
- 代理角色:負(fù)責(zé)對(duì)真是角色的應(yīng)用,把所有抽象主題類定義的方法限制委托給真實(shí)主題角色實(shí)現(xiàn)。
通用類圖:
通用代碼:
package Proxy; //抽象主題類: public interface Subject { public void doSomething(); } package Proxy; //具體主題類 public class RealSubject implements Subject{ @Override public void doSomething() { System.out.println("業(yè)務(wù)邏輯..."); } } package Proxy; //代理主題類 public class Proxy implements Subject{ private Subject sub = null; @Override public void doSomething() { this.sub.doSomething(); } public Proxy(Subject sub){ this.sub = sub; } } package Proxy; //客戶端 public class Client { public static void main(String[] args) { Subject realsub = new RealSubject(); Subject proxy = new Proxy(realsub); proxy.doSomething(); } }
優(yōu)點(diǎn):
1. 職責(zé)清晰
2. 高擴(kuò)展
代理模式的擴(kuò)展:
普通代理:
具體主題類對(duì)高層透明,在代理主題類中構(gòu)造具體主題類
代碼實(shí)現(xiàn):
package GeneralProxy; public interface Subject { public void doSomething(); } package GeneralProxy; public class RealSubject implements Subject{ private String name = null; @Override public void doSomething() { System.out.println(this.name + "被代理,正在執(zhí)行業(yè)務(wù)邏輯..."); } public RealSubject(Subject proxy,String name) throws Exception{ if(proxy == null){ throw new Exception("無(wú)法創(chuàng)建被代理對(duì)象"); }else{ this.name = name; } } } package GeneralProxy; public class Proxy implements Subject{ private Subject realsub = null; public Proxy(String name) { try { realsub = new RealSubject(this, name); } catch (Exception e) { e.printStackTrace(); } } public void doSomething() { realsub.doSomething(); } } package GeneralProxy; public class Client { public static void main(String[] args) { //普通代理 Subject proxy = new Proxy("張三"); proxy.doSomethaing(); } }
強(qiáng)制代理:
必須通過(guò)訪問(wèn)具體主題類獲取代理主題類的對(duì)象,然后用代理主題類控制訪問(wèn)
代碼實(shí)現(xiàn):
package MustProxy; public interface Subject { public void doSomething(); public Subject getProxy(); } package MustProxy; public class RealSubject implements Subject{ private String name = null; private Subject proxy = null; @Override public void doSomething() { if(isProxy()){ System.out.println(this.name + "被代理,正在執(zhí)行業(yè)務(wù)邏輯..."); }else{ System.out.println("請(qǐng)先訪問(wèn)代理..."); } } public RealSubject(String name) { this.name = name; } public Subject getProxy() { proxy = new Proxy(this); return this.proxy; } private boolean isProxy(){ if(this.proxy == null){ return false; }else{ return true; } } } package MustProxy; public class Proxy implements Subject{ private Subject realSub = null; public Proxy(Subject realSub) { this.realSub = realSub; } public void doSomething() { this.realSub.doSomething(); } public Subject getProxy() { return this; } } package MustProxy; public class Client { public static void main(String[] args) { Subject realSub = new RealSubject("張三"); realSub.doSomething(); Subject proxy = realSub.getProxy(); proxy.doSomething(); } }
應(yīng)用場(chǎng)景
現(xiàn)實(shí)世界中,秘書(shū)就相當(dāng)于一個(gè)代理,老板開(kāi)會(huì),那么通知員工開(kāi)會(huì)時(shí)間、布置會(huì)場(chǎng)、會(huì)后整理會(huì)場(chǎng)等等開(kāi)會(huì)相關(guān)工作就可以交給秘書(shū)做,老板就只需要開(kāi)會(huì)就行了,不需要親自做那些事。同理,在我們程序設(shè)計(jì)中也可使用代理模式來(lái)將由一系列無(wú)關(guān)邏輯組合在一起的代碼進(jìn)行解耦合,比如業(yè)務(wù)代碼中的日志代碼就可以在代理中進(jìn)行。Spring的AOP就是典型的動(dòng)態(tài)代理應(yīng)用。
代理模式的應(yīng)用形式
(1)遠(yuǎn)程代理(Remote Proxy) -可以隱藏一個(gè)對(duì)象存在于不同地址空間的事實(shí)。也使得客戶端可以訪問(wèn)在遠(yuǎn)程機(jī)器上的對(duì)象,遠(yuǎn)程機(jī)器可能具有更好的計(jì)算性能與處理速度,可以快速響應(yīng)并處理客戶端請(qǐng)求。
(2)虛擬代理(Virtual Proxy) – 允許內(nèi)存開(kāi)銷較大的對(duì)象在需要的時(shí)候創(chuàng)建。只有我們真正需要這個(gè)對(duì)象的時(shí)候才創(chuàng)建。
(3)寫入時(shí)復(fù)制代理(Copy-On-Write Proxy) – 用來(lái)控制對(duì)象的復(fù)制,方法是延遲對(duì)象的復(fù)制,直到客戶真的需要為止。是虛擬代理的一個(gè)變體。
(4)保護(hù)代理(Protection (Access)Proxy) – 為不同的客戶提供不同級(jí)別的目標(biāo)對(duì)象訪問(wèn)權(quán)限
(5)緩存代理(Cache Proxy) – 為開(kāi)銷大的運(yùn)算結(jié)果提供暫時(shí)存儲(chǔ),它允許多個(gè)客戶共享結(jié)果,以減少計(jì)算或網(wǎng)絡(luò)延遲。
(6)防火墻代理(Firewall Proxy) – 控制網(wǎng)絡(luò)資源的訪問(wèn),保護(hù)主題免于惡意客戶的侵害。
(7)同步代理(SynchronizationProxy) – 在多線程的情況下為主題提供安全的訪問(wèn)。
(8)智能引用代理(Smart ReferenceProxy) - 當(dāng)一個(gè)對(duì)象被引用時(shí),提供一些額外的操作,比如將對(duì)此對(duì)象調(diào)用的次數(shù)記錄下來(lái)等。
(9)復(fù)雜隱藏代理(Complexity HidingProxy) – 用來(lái)隱藏一個(gè)類的復(fù)雜集合的復(fù)雜度,并進(jìn)行訪問(wèn)控制。有時(shí)候也稱為外觀代理(Façade Proxy),這不難理解。復(fù)雜隱藏代理和外觀模式是不一樣的,因?yàn)榇砜刂圃L問(wèn),而外觀模式是不一樣的,因?yàn)榇砜刂圃L問(wèn),而外觀模式只提供另一組接口。
- 詳解JAVA設(shè)計(jì)模式之代理模式
- Java設(shè)計(jì)模式之動(dòng)態(tài)代理模式實(shí)例分析
- Java設(shè)計(jì)模式之靜態(tài)代理模式實(shí)例分析
- 23種設(shè)計(jì)模式(7) java代理模式
- java設(shè)計(jì)模式筆記之代理模式
- java設(shè)計(jì)模式學(xué)習(xí)之代理模式
- java設(shè)計(jì)模式-代理模式(實(shí)例講解)
- Java設(shè)計(jì)模式之代理模式與裝飾模式實(shí)例詳解
- Java設(shè)計(jì)模式之代理模式_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
- java設(shè)計(jì)模式之代理模式(Porxy)詳解
- java設(shè)計(jì)模式—靜態(tài)代理模式(聚合與繼承方式對(duì)比)
- 詳解設(shè)計(jì)模式中的proxy代理模式及在Java程序中的實(shí)現(xiàn)
- Java使用設(shè)計(jì)模式中的代理模式構(gòu)建項(xiàng)目的實(shí)例展示
- Java設(shè)計(jì)模式之代理模式(Proxy模式)介紹
- Java通俗易懂系列設(shè)計(jì)模式之代理模式
相關(guān)文章
Java8中 LocalDate和java.sql.Date的相互轉(zhuǎn)換操作
這篇文章主要介紹了Java8中 LocalDate和java.sql.Date的相互轉(zhuǎn)換操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12idea社區(qū)版如何設(shè)置vm?options
這篇文章主要介紹了idea社區(qū)版如何設(shè)置vm?options問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09Spring Boot security 默認(rèn)攔截靜態(tài)資源的解決方法
這篇文章主要介紹了Spring Boot security 默認(rèn)攔截靜態(tài)資源,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03Java根據(jù)坐標(biāo)經(jīng)緯度計(jì)算兩點(diǎn)距離5種方法及校驗(yàn)經(jīng)緯度是否在圓/多邊形區(qū)域內(nèi)的算法推薦
在項(xiàng)目開(kāi)發(fā)過(guò)程中需要根據(jù)兩地經(jīng)緯度坐標(biāo)計(jì)算兩地間距離,下面這篇文章主要給大家介紹了關(guān)于Java根據(jù)坐標(biāo)經(jīng)緯度計(jì)算兩點(diǎn)距離5種方法以及校驗(yàn)經(jīng)緯度是否在圓/多邊形區(qū)域內(nèi)的算法推薦,需要的朋友可以參考下2023-12-12Springmvc異常映射2種實(shí)現(xiàn)方法
這篇文章主要介紹了Springmvc異常映射2種實(shí)現(xiàn)方法以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。,需要的朋友可以參考下2020-05-05Seata集成Mybatis-Plus解決多數(shù)據(jù)源事務(wù)問(wèn)題
當(dāng)進(jìn)行業(yè)務(wù)操作時(shí),訂單發(fā)生異常 ,進(jìn)行了回滾操作,因?yàn)樵诓煌臄?shù)據(jù)庫(kù)實(shí)例中,余額卻扣除成功,此時(shí)發(fā)現(xiàn)數(shù)據(jù)不一致問(wèn)題,本文給大家介紹Seata集成Mybatis-Plus解決多數(shù)據(jù)源事務(wù)問(wèn)題,感興趣的朋友一起看看吧2023-11-11