1. 程式人生 > >Spring代理模式——靜態代理

Spring代理模式——靜態代理

代理模式:
是一種設計模式,提供了對目標物件的另外訪問方式
即通過代理訪問目標物件
好處:可以在目標物件實現的基礎上,增加額外的功能操作。
擴充套件目標物件的功能


實現方式:
1、靜態代理
儲存資料到資料庫
Dao直接儲存
想額外擴充套件:新增事務

要求:代理物件要實現與目標物件相同的介面
優點:可以做到不修改目標物件的功能前提下,對目標物件擴充套件
缺點:因為代理物件需要實現目標物件相同介面,很有很多代理類
     一旦介面增加方法,目標物件與代理物件都需要維護、
解決:
代理工廠?

動態代理

介面:

package edu.cloud.staticpackage;


public interface IUserDao {
public void save() throws Exception;
}

目標物件:

package edu.cloud.staticpackage;


/**
 * 目標物件
 * @author huangbaida
 * @description 
 * @date 2018年1月23日
 */
public class UserDao implements IUserDao {


@Override
public void save() throws Exception {
//System.out.println("----開啟事務----"); //想擴充套件得修改目標物件的原始碼,不方便
System.out.println("----資料儲存----");
}


}

代理物件:

package edu.cloud.staticpackage;


/**
 * 代理物件(靜態代理)
 * @author huangbaida
 * @description 
 * @date 2018年1月23日
 */
public class UserDaoProxy implements IUserDao {
private IUserDao target;
public UserDaoProxy(IUserDao target) {
this.target = target;
}

@Override
public void save() throws Exception {
//這樣在沒有修改目標物件的情況下,擴充套件了功能
System.out.println("——————開啟事務——————");
target.save();//呼叫目標物件的方法
System.out.println("——————提交事務——————");
}

}

測試:

package edu.cloud.staticpackage;


public class Test {


public static void main(String[] args) {
//目標物件
UserDao target = new UserDao();

//代理物件
IUserDao proxy = new UserDaoProxy(target);

try {
proxy.save();
} catch (Exception e) {
e.printStackTrace();
}
}


}