java--01--靜態代理


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

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com