1. 程式人生 > >java--01--靜態代理

java--01--靜態代理

代理模式 解決 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     }
8 9 @Override 10 public void update() { 11 System.out.println("目標對象, 修改數據..."); 12 13 } 14 15 }
View Code

代理對象向外宣稱蒼老師會唱歌會跳舞

技術分享圖片
 1 // 代理對象, 代理誰? 把目標對象拿進來初始化
 2 public class UserDaoProxy implements IUserDao{
 3 
 4     private IUserDao userDao;
 5     public UserDaoProxy(IUserDao userDao){
6 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 }
View Code

來吧...

技術分享圖片
 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--靜態代理