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
原文地址:https://www.cnblogs.com/bravolove/p/8179848.html