静态代理和动态代理
来源:互联网 发布:编程语言pascal 编辑:程序博客网 时间:2024/05/30 23:02
静态代理和动态代理
介绍
在一些情况下,客户端不想或者不能够直接引用一个对象,而代理对象就可以在客户端和目标对象之间起到中介的作用.代理设计模式:可以先简单理解为代理商或中介的概念,比如上网我们可能就会使用代理服务器去上网.
典型的代理设计模式:proxy对象不是真正的服务提供者,它只是负责中间一些验证监控或日志之类的操作.
备注:代理模式分为两种静态代理和动态代理抽象主题角色:声明了真实主题和代理主题的共同接口 代理主题(Proxy):代理主题角色内部含有对真实主题的引用,从而在任何时候可以操作真实主题对象 真实主题:定义了代理角色所代表的真实对象
静态代理
Net上网Subject
/** * * @author xuyi3 * @2016年9月13日 @上午9:35:31 * @Net 上网类(上网Subject) * @功能说明:<br> * @春风十里不如你 * @备注 */ public class Net { /** * 上网方法 */ public void internet() { System.out.println("internet ... "); } }
Net上网代理对象
/** * * @author xuyi3 * @2016年9月13日 @上午9:31:17 * @NetProxy * @功能说明:<br> * @春风十里不如你 * @备注 */public class NetProxy{ //Net引用 private Net net; public NetProxy() { } /** * <h3>上网方法</h3> * @param username * @param password */ public void internet(String username, String password) { //首先进行身份验证 boolean verifySuccess = verifyIdentity(username, password); if (verifySuccess) { if (net == null) { net = new Net(); } net.internet(); } //上完网之后统计流量信息 countInternetTraffic(); } /** * <h3>验证上网者身份</h3> * @param username 用户账号 * @param password 用户密码 * @return */ private boolean verifyIdentity(String username, String password) { System.out.println("====身份验证===="); //验证上网者身份 return true; } /** * <h3>统计上网信息</h3> * @return */ private int countInternetTraffic() { System.out.println("====统计流量===="); //计算上网流量 return 0; }}
NetApp
/** * @author xuyi3 * @2016年9月13日 @上午9:32:43 * @NetApp * @功能说明:<br> * @春风十里不如你 * @备注 */public class NetApp{ public static void main(String[] args) { //初始化上网代理对象 NetProxy netProxy = new NetProxy(); netProxy.internet("admin", "123"); }}
动态代理
举例:数据库事务操作时,每次操作都要先开启事务然后再提交事务,这样模板式的代码频繁的出现,既不安全也繁琐.可以使用动态代理来帮助我们处理这些样式代码,即AOP面向切面编程。
应用
UserService
/** * * @author xuyi3 * @2016年9月13日 @上午10:27:21 * @UserService * @功能说明:<br> * @春风十里不如你 * @备注 */public interface UserService{ void addUser(String username);}
UserServiceImpl
/** * * @author xuyi3 * @2016年9月13日 @上午10:25:27 * @UserServiceImpl * @功能说明: * @春风十里不如你 * @备注 */public class UserServiceImpl implements UserService{ public void addUser(String username) { System.out.println("addUser ... username:" + username); }}
PersonService
/** * * @author xuyi3 * @2016年9月13日 @上午10:27:54 * @PersonService * @功能说明:<br> * @春风十里不如你 * @备注 */public interface PersonService{ void addPerson(String name);}
PersonServiceImpl
/** * * @author xuyi3 * @2016年9月13日 @上午10:25:13 * @PersonServiceImpl * @功能说明:<br> * @春风十里不如你 * @备注 */public class PersonServiceImpl implements PersonService{ public void addPerson(String name) { System.out.println("addPerson... name:" + name); }}
ObjectProxy
/** * 看其名字ObjectProxy就可以知道其是万能代理对象 * @author xuyi3 * @2016年9月13日 @上午10:28:30 * @ObjectProxy * @功能说明:<br> * @春风十里不如你 * @备注 */public class ObjectProxy implements InvocationHandler{ //待代理对象 private Object target; /** * <h3>通过构造方法传入需要使用的主题实现类对象</h3> * * @param target */ public ObjectProxy(Object target) { this.target = target; } /** * <h3>使用Proxy创建代理对象实例</h3> * 核心方法 * @return */ public Object createProxy() { return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); } /** * @param proxy * @param method * @param args * @return * @throws Throwable */ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { beforeInvoke(); // System.out.println(method.getName());// 输出执行方法名 Object result = method.invoke(target, args); afterInvoke(); return result; } private void beforeInvoke() { System.out.println("begin事务 ..."); } private void afterInvoke() { System.out.println("commit事务 ..."); }}
MainApp
/** * * @author xuyi3 * @2016年9月13日 @上午9:53:40 * @MainApp * @功能说明:<br> * @春风十里不如你 * @备注 */public class MainApp{ public static void main(String[] args) throws Exception { UserService userService = new UserServiceImpl(); ObjectProxy objectProxy1 = new ObjectProxy(userService); UserService userServiceProxy = (UserService) objectProxy1.createProxy(); userServiceProxy.addUser("admin"); System.out.println("------------------"); PersonService personService = new PersonServiceImpl(); ObjectProxy objectProxy2 = new ObjectProxy(personService); PersonService personServiceProxy = (PersonService) objectProxy2.createProxy(); personServiceProxy.addPerson("xuyi"); }}
总结
代理设计模式是现实开发中比较常使用到的,同时动态代理也是Spring AOP面向切面技术的基础理论。
0 0
- 静态代理和动态代理
- 静态代理和动态代理
- 静态代理和动态代理
- 静态代理和动态代理
- 动态代理和静态代理
- 静态代理和动态代理
- 静态代理和动态代理
- 静态代理和动态代理
- 动态代理和静态代理
- 静态代理和动态代理
- 动态代理和静态代理
- 动态代理和静态代理
- 静态代理和动态代理
- 动态代理和静态代理
- 静态代理和动态代理
- 静态代理和动态代理
- 动态代理和静态代理
- 静态代理和动态代理
- Oracle 12c Study之--Enterprise Manager Cloud Control Install
- 笔记:String常用的操作方法
- ADF(UI)--在<af:table>里多行编辑时去掉必填字段的验证提示
- One Boam技巧 有关十字行列
- 二分查找的非递归实现
- 静态代理和动态代理
- BootstrapSouce的排版+响应式导航
- ListView中CheckBox复用问题
- 黑盒测试——错误推测法
- Android_project目录及文件详解
- 【学习笔记】快速平方根倒数算法
- 数控进入数控显示实体四轴四面Cube应用软件开发
- curl模拟请求、登陆以及带验证码登陆
- MySQL 基础使用方式