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 }
目标对象把活全干完,唱歌跳舞都必须要干
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 }
代理对象向外宣称苍老师会唱歌会跳舞
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 }
来吧...
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 }