java設(shè)計模式之代理模式(Porxy)詳解
一、什么是代理模式(Porxy)
概念:代理模式就是為其他對象提供一種代理以控制對這個對象的訪問。
現(xiàn)實生活中也有很多行為吻合代理模式。比如店外賣,客戶在APP上下單后,店長會接單。這個時候店長可以選擇自己去送這份外賣,也可以委托送餐員代理店長去送這份外賣。當(dāng)然店長是可以自己送,但店長送了外賣店就沒人看著了,而讓送餐員代理送外賣就不會這樣了。這里很顯然店長是對象本尊(Subject),送餐員是代理對象(Proxy ),代理對象中有店長給的訂單信息,比如送到哪里,幾點之前要送到,這就說明代理對象中需要包含本尊。下面根據(jù)實際代碼來說明代理模式和非代理的具體實現(xiàn)。
二、模式對比
1、非代理模式
非代理模式即店長自己送,無須委托送餐員代理送。即直接創(chuàng)建本尊對象并訪問本尊方法,沒有中間的代理對象。
本尊代碼
public class ShopKeeper {
//客戶信息
private Consumer consumer;
public ShopKeeper(Consumer consumer){
this.consumer = consumer;
}
//外賣訂單信息
public void send(){
System.out.println(consumer.getConName() + "的訂單,店長自己送,送到膠東路520弄,11:30之前送達...");
}
}
客戶代碼
public class Consumer {
private String conName;
public Consumer(String conName){
this.conName = conName;
}
public String getConName() {
return conName;
}
}
客戶端測試代碼
public class Show {
public static void main(String[] args) {
Consumer consumer = new Consumer("Tom");
ShopKeeper shopKeeper = new ShopKeeper(consumer);
shopKeeper.send();
}
}
這樣店長和客戶的代碼就耦合在一起,不利于后期維護升級。再者店長和客戶本來就不需要相互包含,他們之間是無狀態(tài)的。像很多pub/sub的中間件,比如dubbo,activeMQ等等,他們都是基于消息的發(fā)布的訂閱機制,生產(chǎn)者和消費者之間沒有必要有狀態(tài)交互,你消費者掛了我生產(chǎn)者還是繼續(xù)生產(chǎn)消息,互不影響,其實很多技術(shù)都是想通的,這里和代理模式就和類似。下面來看看代理模式是怎么處理的。
2、代理模式
提供了一個共有的送外賣接口
public interface Send {
void sendName();
void sendTime();
void sendAddress();
}
店長本尊對象,實現(xiàn)了共有的送外賣接口。
/**
* 店長對象(本尊)需要實現(xiàn)Send接口
* @author user
*/
public class ShopKeeper implements Send{
private Consumer consumer;
public ShopKeeper(Consumer consumer){
this.consumer = consumer;
}
@Override
public void sendName() {
System.out.print(consumer.getConName() + "的訂單,");
}
@Override
public void sendTime() {
System.out.print("12:00之前送達,");
}
@Override
public void sendAddress() {
System.out.print("送到長島路520弄,由代理對象配送...");
}
新增了代理對象,代理對象需要包含本尊,并且也要實現(xiàn)送外賣(Send)接口
/**
* 代理對象也需要實現(xiàn)Send接口
* @author user
*
*/
public class ProxySend implements Send{
private ShopKeeper shopKeeper;
public ProxySend(Consumer consumer){
this.shopKeeper = new ShopKeeper(consumer);
}
@Override
public void sendName() {
shopKeeper.sendName();
}
@Override
public void sendTime() {
shopKeeper.sendTime();
}
@Override
public void sendAddress() {
shopKeeper.sendAddress();
}
}
客戶對象沒有變化
public class Consumer{
private String conName;
public String getConName() {
return conName;
}
public void setConName(String conName) {
this.conName = conName;
}
}
客戶端測試代碼
public class Show {
public static void main(String[] args) {
Consumer consumer = new Consumer();
consumer.setConName("外賣張");
ProxySend proxy = new ProxySend(consumer);
proxy.sendName();
proxy.sendTime();
proxy.sendAddress();
}
}
看輸出
外賣張的訂單,12:00之前送達,送到長島路520弄...
這樣代理對象就幫本尊完成了任務(wù),可以看到客戶端的代碼變化很大,客戶端根本不知道本尊的存在,因為在客戶端代碼中至始至終都沒有看到本尊對象的創(chuàng)建,連實例都沒有,這其實就是代理對象的作用之一,隱藏本尊。
3、代理模式基本結(jié)構(gòu)
Subject類,定義了RealSubject和Proxy的共用接口,這樣就在任何使用RealSubject的地方都可以使用Proxy,這里使用抽象類
public abstract class Subject {
public abstract void request();
}
RealSubject類,定義了Proxy所代表的真是實體
public class RealSubject extends Subject {
@Override
public void request() {
System.out.println("真實的請求");
}
}
Proxy類,保存了一個引用使得代理對象可以訪問實體對象,并提供一個與Subject的接口相同的接口,這樣代理就可以用來代理實體。
public class Proxy extends Subject{
RealSubject realSubject;
@Override
public void request() {
if (realSubject == null) {
realSubject = new RealSubject();
}
realSubject.request();
}
}
客戶端代碼
public class Show {
public static void main(String[] args) {
Proxy proxy = new Proxy();
proxy.request();
}
}
測試結(jié)果
真實的請求
4、UML圖

三、總結(jié)
代理模式一般用在一下幾種場合。1、遠程代理,也就是為了一個對象在不同的地址空間提供局部代表。這樣可以隱藏一個對象存在于不同地址空間的事實。2、虛擬代理,是根據(jù)需要創(chuàng)建開銷很大的對象。通過它來存放實例化需要很長時間的真實對象。3、安全代理,用來控制真實對象訪問是的權(quán)限。4、智能指引,是指當(dāng)前調(diào)用真實的對象時,代理處理另外一些事情。所以代理模式還算比較常用的。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 詳解JAVA設(shè)計模式之代理模式
- Java設(shè)計模式之動態(tài)代理模式實例分析
- Java設(shè)計模式之靜態(tài)代理模式實例分析
- 23種設(shè)計模式(7) java代理模式
- java設(shè)計模式筆記之代理模式
- java設(shè)計模式學(xué)習(xí)之代理模式
- java設(shè)計模式-代理模式(實例講解)
- Java設(shè)計模式之代理模式與裝飾模式實例詳解
- Java設(shè)計模式之代理模式_動力節(jié)點Java學(xué)院整理
- java設(shè)計模式—靜態(tài)代理模式(聚合與繼承方式對比)
- 詳解設(shè)計模式中的proxy代理模式及在Java程序中的實現(xiàn)
- Java使用設(shè)計模式中的代理模式構(gòu)建項目的實例展示
- 實例講解Java設(shè)計模式編程中如何運用代理模式
- Java設(shè)計模式之代理模式(Proxy模式)介紹
- Java通俗易懂系列設(shè)計模式之代理模式
相關(guān)文章
Java畢業(yè)設(shè)計實戰(zhàn)之健身俱樂部管理系統(tǒng)的實現(xiàn)
這是一個使用了java+SSM+Mysql+Jsp開發(fā)的健身俱樂部管理系統(tǒng),是一個畢業(yè)設(shè)計的實戰(zhàn)練習(xí),具有俱樂部管理該有的所有功能,感興趣的朋友快來看看吧2022-02-02
SpringBoot3整合pageHelper實現(xiàn)分頁功能
PageHelper是一個開源的Java分頁插件,它提供了方便的分頁查詢功能,適用于大多數(shù)基于Java的持久層框架(如MyBatis、Hibernate等),本文給大家介紹了springboot3整合pageHelper實現(xiàn)分頁功能的方法,需要的朋友可以參考下2024-08-08
spring boot優(yōu)雅集成redisson詳解
這篇文章主要為大家介紹了spring boot優(yōu)雅集成redisson詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-11-11
微信小程序獲取手機號的完整實例(Java后臺實現(xiàn))
我們在做小程序開發(fā)的過程中,經(jīng)常會涉及到用戶身份的問題,最普遍的就是我們要獲取用戶的手機號碼,下面這篇文章主要給大家介紹了關(guān)于微信小程序獲取手機號的完整實例,后臺由Java實現(xiàn),需要的朋友可以參考下2022-06-06

