代理模式(Proxy):代理模式其實就是多一個代理類出來,替原對象進行一些操作。比如咱有的時候打官司需要請律師,因為律師在法律方面有專長,可以替咱進行操作表達咱的想法,這就是代理的意思。代理模式分為兩類:1、靜態代理(不使用jdk里面的方法);2、動態代理(使用jdk里面的InvocationHandler和Proxy)。下面請看示例:
##一、靜態代理
### 1、uml建模:

##2、代碼實現
~~~
/**
* 示例(一):代理模式 --靜態代理(沒有調用JDK里面的方法)
*
* 目標接口
*/
interface Targetable {
public void targetMethod();
}
class Target implements Targetable {
@Override
public void targetMethod() {
System.out.println("this is a target method...");
}
}
class Proxy implements Targetable {
private Target target;
public Proxy() {
this.target = new Target();
}
private void beforeMethod() {
System.out.println("this is a method before proxy...");
}
private void afterMethod() {
System.out.println("this is a method after proxy...");
}
/**
* 在執行目標方法前后加了邏輯
*/
@Override
public void targetMethod() {
beforeMethod();
target.targetMethod();
afterMethod();
}
}
/**
* 客戶端測試類
*
* @author Leo
*/
public class Test {
public static void main(String[] args) {
/**
* 創建代理對象
*/
Targetable proxy = new Proxy();
/**
* 執行代理方法
*/
proxy.targetMethod();
}
}
~~~
##二、動態代理
### 1、uml建模:

### 2、代碼實現
~~~
/**
* 示例(二):代理模式 --動態代理
*
* 以添加用戶為例
*/
class User {
private String username;
private String password;
public User() {
}
public User(String username, String password) {
this.username = username;
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User [username=" + username + ", password=" + password + "]";
}
}
/**
* 目標接口
*/
interface IUserDao {
public void add(User user);
}
class UserDaoImpl implements IUserDao {
@Override
public void add(User user) {
System.out.println("add a user successfully...");
}
}
/**
* 日志類 --> 待織入的Log類
*/
class LogEmbed implements InvocationHandler {
private IUserDao target;
/**
* 對target進行封裝
*/
public IUserDao getTarget() {
return target;
}
public void setTarget(IUserDao target) {
this.target = target;
}
private void beforeMethod() {
System.out.println("add start...");
}
private void afterMethod() {
System.out.println("add end...");
}
/**
* 這里用到了反射
*
* proxy 代理對象
*
* method 目標方法
*
* args 目標方法里面參數列表
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
beforeMethod();
// 回調目標對象的方法
method.invoke(target, args);
System.out.println("LogEmbed --invoke-> method = " + method.getName());
afterMethod();
return null;
}
}
/**
* 客戶端測試類
*
* @author Leo
*/
public class Test {
public static void main(String[] args) {
IUserDao userDao = new UserDaoImpl();
LogEmbed log = new LogEmbed();
log.setTarget(userDao);
/**
* 根據實現的接口產生代理
*/
IUserDao userDaoProxy = (IUserDao) Proxy.newProxyInstance(userDao
.getClass().getClassLoader(), userDao.getClass()
.getInterfaces(), log);
/**
* 注意:這里在調用IUserDao接口里的add方法時,
* 代理對象會幫我們調用實現了InvocationHandler接口的LogEmbed類的invoke方法。
*
* 這樣做,是不是有點像Spring里面的攔截器呢?
*/
userDaoProxy.add(new User("張三", "123"));
}
}
~~~
##三、總結
代理模式好處:1、一個代理類調用原有的方法,且對產生的結果進行控制。2、可以將功能劃分的更加清晰,有助于后期維護。
- 前言
- (一)策略模式建模與實現
- (二)觀察者模式建模與實現
- (三)裝飾者模式建模與實現
- (四)工廠方法模式建模與實現
- (五)抽象工廠模式建模與實現
- (六)單例模式建模與實現
- (七)命令模式建模與實現
- (八)適配器模式建模與實現
- (九)外觀模式建模與實現
- (十)模板方法模式建模與實現
- (十一)迭代器模式建模與實現
- (十二)組合模式建模與實現
- (十三)狀態模式建模與實現
- (十四)代理模式建模與實現
- (十五)建造者模式建模與實現
- (十六)原型模式建模與實現
- (十七)橋接模式建模與實現
- (十八)責任鏈模式建模與實現
- (十九)備忘錄模式建模與實現
- (二十)解釋器模式建模與實現
- (二十一)享元模式建模與實現
- (二十二)中介者模式建模與實現
- (二十三)訪問者模式建模與實現
- Java設計模式博客全目錄