什麼是代理模式
我覺得代理模式就是爲一個對象提供了一個替身,並通過這個替身去訪問目標對象,以增加功能
例如:張三打官司,可是張三不懂法,所以聘請一個叫羅翔的律師去幫助張三處理案件就相當於張三也懂法律了,這裏的張三是被代理類,羅翔是代理類。
代理模式有不同的形式,主要有三種靜態代理、動態代理(jdk代理)和cglib代理。這次主要談論靜態代理模式
什麼是靜態代理模式
靜態代理在使用時需要定義接口或者父類被代理對象與代理對象起實現相同的接口或者是繼承相同父類。
具體應該具有這些要求
- 定義一個接口
- 目標對象實現接口
- 代理對象也實現接口
- 調用代理對象的方法來調用目標對象
案例
b站用戶分爲兩種,一種是大會員,一種是普通會員。
普通會員可以觀看用戶投稿的視頻,大會員額外可以觀看正版番劇。他們的權限是不一樣的。
現在要使用代理模式模擬b站用戶的權限管理。
類圖
代碼
首先定義一個接口,定義看的方法
package proxy;
//接口
public interface IUser {
void see();//看的方法
}
第二步定義一個被代理類調用接口,並重寫接口的方法
package proxy;
//被代理類
public class User implements IUser {
@Override
public void see() {
// TODO Auto-generated method stub
System.out.println("可以觀看用戶投稿的視頻");
}
}
第三步定義一個代理類調用接口重寫接口的方法,並通過接口去聚合目標對象
package proxy;
//代理類
public class UserProxy implements IUser {
private IUser target;//通過接口來聚合目標對象,是目標對象成爲代理類的一部分
//構造器
public UserProxy(IUser target) {
this.target = target;
}
@Override
public void see() {
// TODO Auto-generated method stub
System.out.println("你是大會員");
System.out.println("可以看正版番劇");
target.see();
}
}
最後編寫客戶端
package proxy;
//客戶端
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
//創建一個被代理對象
User user = new User();
//直接實現被代理對象的方法
user.see();
System.out.println("**************");
//創建一個代理對象,並將被代理對象傳遞給代理對象
UserProxy userProxy = new UserProxy(user);
//通過代理對象實現被代理對象的方法
userProxy.see();
}
}
運行截圖
靜態代理優缺點
優點:
在不修改目標對象的功能前提下,能通過代理對象對目標功能擴展
缺點
類的數量變多了,而且一旦接口增加方法目標對象與代理對象都要維護
希望對看到這裏的諸位有所幫助,如果喜歡這篇個人理解不妨點一個贊,謝謝~。