代理模式(靜態代理)
目錄
代理模式(靜態)
定義:
代理模式給某一個物件提供一個代理物件,並由代理物件控制對原物件的引用。通俗的來講代理模式就是我們生活中常見的中介。一般我們寫程式碼的時候, 對已經存在的程式碼儘量不要在修改了, 因為可能好多地方都呼叫這個方法, 改掉之後可能會出問題, 但是我們可以使用代理物件呼叫之前的方法進行內容擴充.
意圖:
為其他物件提供一種代理以控制對這個物件的訪問。
主要解決:
在直接訪問物件時帶來的問題,比如說:要訪問的物件在遠端的機器上。在面向物件系統中,有些物件由於某些原因(比如物件建立開銷很大,或者某些操作需要安全控制,或者需要程序外的訪問),直接訪問會給使用者或者系統結構帶來很多麻煩,我們可以在訪問此物件時加上一個對此物件的訪問層。
應用例項:
-
Windows 裡面的快捷方式。
-
豬八戒去找高翠蘭結果是孫悟空變的,可以這樣理解:把高翠蘭的外貌抽象出來,高翠蘭本人和孫悟空都實現了這個介面,豬八戒訪問高翠蘭的時候看不出來這個是孫悟空,所以說孫悟空是高翠蘭代理類。
-
買火車票不一定在火車站買,也可以去代售點。
-
一張支票或銀行存單是賬戶中資金的代理。支票在市場交易中用來代替現金,並提供對簽發人賬號上資金的控制。
-
spring aop。
程式碼案例:
例如租房: 客戶租房可以找中介, 中介幫你找房東出租房子, 這裡的中介起到的就是代理作用
1.出租房子
com.test.Rent
// 出租房子 public interface Rent { // 給了錢返回房子 Object rent(Object money); }
2.業主(要出租房屋的人
com.test.Host
// 業主, 出租房子
public class Host implements Rent {
@Override
public Object rent(Object money) {
System.out.println("業主(真實物件): 房屋出租成功...價錢" + money);
return new Object(); // 假如Object就是出租的房子
}
}
3.代理(中介公司)
你只需要找中介租房即可, 不需要直接找業主
com.test.Proxy
// 代理, 中介公司
public class Proxy implements Rent {
// 提供真實物件, 被代理的物件
private Rent host = new Host();
@Override
public Object rent(Object money) {
// 1. 約時間
time();
// 2. 看房子
seeHouse();
// 3. 講價錢, 籤協議
killPrice();
// 呼叫業主的方法進行出租
Object house = host.rent(money);
// 4. 後期維護
weihu();
return null;
}
public void time() {
System.out.println("約時間");
}
public void seeHouse() {
System.out.println("看房子");
}
public void killPrice() {
System.out.println("講價錢, 籤協議");
}
public void weihu() {
System.out.println("後期維護");
}
}
4.客戶租房子
com.test.Customer
// 客戶, 要租房子
public class Customer {
public static void main(String[] args) {
// 找中介
Rent agent = new Proxy();
// 租房
agent.rent(3000);
}
}
結果:
約時間
看房子
講價錢, 籤協議
業主(真實物件): 房屋出租成功...價錢3000
後期維護
優點
- 職責清晰。
- 高擴充套件性。
- 智慧化。
缺點
- 由於在客戶端和真實主題之間增加了代理物件,因此有些型別的代理模式可能會造成請求的處理速度變慢。
- 實現代理模式需要額外的工作,有些代理模式的實現非常複雜。
- 靜態代理的程式碼量比較大
總結
例如我們在呼叫service的時候, service層的一個現有存在的方法和現在的需求很相似, 但是我們不能對其更改, 因為在所有使用這個方法的地方都有可能出問題, 這時候我們就可以建立一個serviceProxy物件, 去實現之前service的介面, 在代理物件裡面呼叫之前service的方法, 就可以不改變原有程式碼的情況下, 實現程式碼的複用