日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java设计模式-Proxy代理模式

發(fā)布時(shí)間:2025/3/20 java 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java设计模式-Proxy代理模式 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

問題分析:

什么是代理模式呢?其實(shí)我們在生活中并不少見。對于程序員來說最常接觸的莫過于代理上網(wǎng)了,連接大力服務(wù)器地址,就可以訪問網(wǎng)絡(luò)。

還有每天吃飯趕進(jìn)度是常事,叫公司的同事幫忙帶飯也是一種代理;如果你辭職老板不給你發(fā)工資,那么你還得請個(gè)律師幫你打官司,這也是一種代理。總之生活中無處不在。

代理的定義:

為其他對象提供一種代理以控制對這個(gè)對象的訪問。簡單點(diǎn)就是在不直接操作訪問對象的的情況下,找一個(gè)代理訪問該對象,就是自己不想搞,這個(gè)其他人幫你搞。

基本UML圖:


具體問題UML類圖:


抽象主題類Subject.java

package com.hust.staticProxy1;public abstract class Subject {public abstract void visit();//普通業(yè)務(wù)方法 } 實(shí)現(xiàn)抽象主題的真正主題類RealSubject.java

package com.hust.staticProxy1;public class RealSubject extends Subject {public void visit() {System.out.println("Real Subject!");}} 代理類ProxySubject.java

package com.hust.staticProxy1; //代理類 public class ProxySubject extends Subject {private RealSubject mRealSubject;//把被代理對象作為成員變量public ProxySubject(RealSubject mRealSubject){this.mRealSubject=mRealSubject;}public void visit() {mRealSubject.visit();//調(diào)用被代理對象的邏輯方法}} Client.java

package com.hust.staticProxy1;public class Client {/*** @param args*/public static void main(String[] args) {//實(shí)例化一個(gè)被代理對象RealSubject mRealSubject=new RealSubject();//用被代理對象構(gòu)造一個(gè)代理對象ProxySubject mProxySubject=new ProxySubject(mRealSubject);//調(diào)用代理對象的相關(guān)方法mProxySubject.visit();}} 代理模式的簡單實(shí)現(xiàn):
設(shè)定一個(gè)故事情節(jié),小明上班遇到一個(gè)被老板拖欠工資甚至克扣工資的情況,這種情況下小明還是通過法律來解決問題,一旦小明選擇走法律途徑解決該糾紛,那么不可避免的需要請個(gè)律師作為自己的訴訟代理人,我們將訴訟流程抽象在一個(gè)接口中。

訴訟接口類

package com.hust.staticProxy2;public interface LawSuit {//提交申請void submit();//進(jìn)行舉證void burden();//開始辯護(hù)void defend();//訴訟完成void finish(); } 具體訴訟人,就是被代理對象小明,就是他想做的事

package com.hust.staticProxy2;public class XiaoMing implements LawSuit {//被代理類,實(shí)現(xiàn)訴訟接口public void submit() {// 老板欠小明工資,小明只好申請仲裁System.out.println("老板欠小明工資,小明只好申請仲裁");}public void burden() {//小明證據(jù)充足,不怕告不贏System.out.println("這是合同書和過去一年的銀行卡工資流水");}public void defend() {// 鐵證如山,辯護(hù)也沒什么好說的System.out.println("證據(jù)確鑿!不需要早說些什么了!");}public void finish() {// 結(jié)果也肯定的System.out.println("訴訟成功,判決老板即日起七天內(nèi)結(jié)算工資");}} 代理律師類:就是代理對象,小明讓這個(gè)代理類完成訴訟流程

package com.hust.staticProxy2; //律師代理類 public class Lawyer implements LawSuit{private LawSuit mLawSuit;public Lawyer(LawSuit mLawSuit){this.mLawSuit=mLawSuit;}public void submit() {// 調(diào)用被代理類的方法mLawSuit.submit();}public void burden() {// 調(diào)用被代理類的方法mLawSuit.burden();}public void defend() {// 調(diào)用被代理類的方法mLawSuit.defend();}public void finish() {// 調(diào)用被代理類的方法mLawSuit.finish();}} 客戶端類

package com.hust.staticProxy2;public class ClientTest {/*** @param args*/public static void main(String[] args) {//構(gòu)造被代理對象小明LawSuit xiaoming=new XiaoMing();//小明委托代理對象律師Lawyer mLawyer=new Lawyer(xiaoming);//代理對象律師幫助小明提出訴訟申請mLawyer.submit();//代理對象律師進(jìn)行舉證mLawyer.burden();//代理對象律師代替小明進(jìn)行辯護(hù)mLawyer.defend();//代理對象律師完成訴訟mLawyer.finish();}} 輸出:

老板欠小明工資,小明只好申請仲裁 這是合同書和過去一年的銀行卡工資流水 證據(jù)確鑿!不需要早說些什么了! 訴訟成功,判決老板即日起七天內(nèi)結(jié)算工資
代理模式的意義:
代理模式到底好處在哪里呢??
那先要說一下代理模式中的三種角色了。
   抽象角色:聲明真實(shí)對象和代理對象的共同接口。
   代理角色代理對象角色內(nèi)部含有對真實(shí)對象的引用, 從而可以操作 真實(shí)對象,同時(shí)代理對象提供與真實(shí)對象相同的接口以便在任何時(shí)刻都能代替真實(shí)對象。同時(shí),代理對象,可以在執(zhí)行真實(shí)對象操作時(shí),附加其他的操作,相當(dāng)于對真實(shí)對象進(jìn)行封裝。

  真實(shí)角色代理角色所代表的真實(shí)對象,是我們最終要引用的對象

  代理模式的一個(gè)好處就是對外部提供統(tǒng)一的接口方法,而代理類在接口中實(shí)現(xiàn)對真實(shí)類的附加操作行為,從而可以在不影響外部調(diào)用情況下,進(jìn)行系統(tǒng)擴(kuò)展。也就是說,我要修改真實(shí)角色的操作的時(shí)候,盡量不要修改他,而是在外部在“包”一層進(jìn)行附加行為,即代理類。例如:接口A有一個(gè)接口方法operator(),真實(shí)角色:RealA實(shí)現(xiàn)接口A,則必須實(shí)現(xiàn)接口方法operator()。客戶端Client調(diào)用接口A的接方法operator()。現(xiàn)在新需求來了,需要修改RealA中的operator()的操作行為。怎么辦呢?如果修改RealA就會影響原有系統(tǒng)的穩(wěn)定性,還要重新測試。這是就需要代理類實(shí)現(xiàn)附加行為操作。創(chuàng)建代理ProxyA實(shí)現(xiàn)接口A,并將真實(shí)對象RealA注入進(jìn)來。ProxyA實(shí)現(xiàn)接口方法operator(),另外還可以增加附加行為,然后調(diào)用真實(shí)對象的operator()。從而達(dá)到了“對修改關(guān)閉,對擴(kuò)展開放”,保證了系統(tǒng)的穩(wěn)定性。我們看客戶端Client調(diào)用仍是接口A的接口方法operator(),只不過實(shí)例變?yōu)榱薖roxyA類了而已。也就是說代理模式實(shí)現(xiàn)了ocp原則。


什么時(shí)候使用代理模式
  當(dāng)我們需要使用的對象很復(fù)雜或者需要很長時(shí)間去構(gòu)造,這時(shí)就可以使用代理模式(Proxy)。例如:如果構(gòu)建一個(gè)對象很耗費(fèi)時(shí)間和計(jì)算機(jī)資源,代理模式(Proxy)允許我們控制這種情況,直到我們需要使用實(shí)際的對象。一個(gè)代理(Proxy)通常包含和將要使用的對象同樣的方法,一旦開始使用這個(gè)對象,這些方法將通過代理(Proxy)傳遞給實(shí)際的對象。 一些可以使用代理模式(Proxy)的情況:
  1,一個(gè)對象,比如一幅很大的圖像,需要載入的時(shí)間很長。    
  ? ?2,一個(gè)需要很長時(shí)間才可以完成的計(jì)算結(jié)果,并且需要在它計(jì)算過程中顯示中間結(jié)果
  3,一個(gè)存在于遠(yuǎn)程計(jì)算機(jī)上的對象,需要通過網(wǎng)絡(luò)載入這個(gè)遠(yuǎn)程對象則需要很長時(shí)間,特別是在網(wǎng)絡(luò)傳輸高峰期。
  4,一個(gè)對象只有有限的訪問權(quán)限,代理模式(Proxy)可以驗(yàn)證用戶的權(quán)限


  代理模式(Proxy)也可以被用來區(qū)別一個(gè)對象實(shí)例的請求和實(shí)際的訪問,例如:在程序初始化過程中可能建立多個(gè)對象,但并不都是馬上使用,代理模式(Proxy)可以載入需要的真正的對象。這是一個(gè)需要載入和顯示一幅很大的圖像的程序,當(dāng)程序啟動時(shí),就必須確定要顯示的圖像,但是實(shí)際的圖像只能在完全載入后才可以顯示!這時(shí)我們就可以使用代理模式(Proxy)。


總結(jié)

以上是生活随笔為你收集整理的Java设计模式-Proxy代理模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。