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();
}
}
}