java--01--靜態代理
阿新 • • 發佈:2018-01-03
代理模式 解決 out 開啟事務 功能 this 代理類 方法 分享圖片
1. 代理模式 1.1 概述 代理(Proxy)是一種設計模式, 提供了對目標對象另外的訪問方式;即通過代理訪問目標對象。 這樣好處: 可以在目標對象實現的基礎上,增強額外的功能操作。(擴展目標對象的功能)。 舉例:明星(蒼老師)<---精濟人<-------用戶 目標 (代理) 代理模式的關鍵點: 代理對象與目標對象。 1.2 靜態代理 靜態代理, 1) 代理對象,要實現與目標對象一樣的接口; 2) 舉例: 保存用戶(模擬) Dao , 直接保存 DaoProxy, 給保存方法添加事務處理 總結靜態代理: 1)可以做到在不修改目標對象的功能前提下,對目標對象功能擴展。 2)缺點: --》 因為代理對象,需要與目標對象實現一樣的接口。所以會有很多代理類,類太多。 --》 一旦接口增加方法,目標對象與代理對象都要維護。 解決: 代理工廠? 可以使用動態代理。
接口:(跳舞, 還是唱歌?)
1 public interface IUserDao { 2 3 void save(); 4 5 void update(); 6 }View Code
目標對象把活全幹完,唱歌跳舞都必須要幹
1 // 目標對象 2 public class UserDao implements IUserDao{ 3 4 @Override 5 public void save() { 6 System.out.println("目標對象,插入數據到DB中..."); 7 }View Code8 9 @Override 10 public void update() { 11 System.out.println("目標對象, 修改數據..."); 12 13 } 14 15 }
代理對象向外宣稱蒼老師會唱歌會跳舞
1 // 代理對象, 代理誰? 把目標對象拿進來初始化 2 public class UserDaoProxy implements IUserDao{ 3 4 private IUserDao userDao; 5 public UserDaoProxy(IUserDao userDao){View Code6 this.userDao = userDao; 7 } 8 9 @Override 10 public void save() { 11 System.out.println("代理對象, 開啟事務"); 12 userDao.save();//目標對象 13 System.out.println("代理對象, 提交事務"); 14 15 } 16 17 @Override 18 public void update() { 19 System.out.println("代理對象, 開啟事務"); 20 userDao.update();//目標對象 21 System.out.println("代理對象, 提交事務"); 22 } 23 24 25 }
來吧...
1 public class ProxyTest { 2 3 public static void main(String[] args) { 4 //1.靜態代理 5 /* IUserDao target = new UserDao(); 6 IUserDao proxy = new UserDaoProxy(target); 7 proxy.save(); 8 proxy.update(); 9 */ 10 /* 11 代理對象, 開啟事務 12 目標對象,插入數據到DB中... 13 代理對象, 提交事務 14 15 開啟事務 16 目標對象, 修改數據... 17 提交事務 18 */ 19 20 //2.動態代理 21 IUserDao target = new UserDao(); 22 IUserDao proxy = (IUserDao) new ProxyFactory(target).getProxyInstance(); 23 proxy.save(); 24 proxy.update(); 25 /* 26 開啟事務 27 目標對象,插入數據到DB中... 28 提交事務 29 30 開啟事務 31 目標對象, 修改數據... 32 提交事務 33 */ 34 } 35 }View Code
java--01--靜態代理