Java设计模式-代理模式
来源:互联网 发布:js贪吃蛇 编辑:程序博客网 时间:2024/06/06 19:44
1、概念
代理模式(Proxy):代理模式其实就是多一个代理类出来,替原对象进行一些操作。比如咱有的时候打官司需要请律师,因为律师在法律方面有专长,可以替咱进行操作表达咱的想法,这就是代理的意思。代理模式分为两类:
(1)静态代理(不使用jdk里面的方法);
(2)动态代理(使用jdk里面的InvocationHandler和Proxy);
2、静态代理
/** * 示例(一):代理模式 --静态代理(没有调用JDK里面的方法) * * 目标接口 */ interface Targetable { public void targetMethod(); } class Target implements Targetable { @Override public void targetMethod() { System.out.println("this is a target method..."); } } class Proxy implements Targetable { private Target target; public Proxy() { this.target = new Target(); } private void beforeMethod() { System.out.println("this is a method before proxy..."); } private void afterMethod() { System.out.println("this is a method after proxy..."); } /** * 在执行目标方法前后加了逻辑 */ @Override public void targetMethod() { beforeMethod(); target.targetMethod(); afterMethod(); } }
/** * 客户端测试类 */ public class Test { public static void main(String[] args) { /** * 创建代理对象 */ Targetable proxy = new Proxy(); /** * 执行代理方法 */ proxy.targetMethod(); } }
3、动态代理
/** * 示例(二):代理模式 --动态代理 * * 以添加用户为例 */ class User { private String username; private String password; public User() { } public User(String username, String password) { this.username = username; this.password = password; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "User [username=" + username + ", password=" + password + "]"; } }
/** * 目标接口 */ interface IUserDao { public void add(User user); } class UserDaoImpl implements IUserDao { @Override public void add(User user) { System.out.println("add a user successfully..."); } }
//代理类public class LogEmbed implements InvocationHandler { private IUserDao target; /** * 对target进行封装 */ public IUserDao getTarget() { return target; } public void setTarget(IUserDao target) { this.target = target; } private void beforeMethod() { System.out.println("add start..."); } private void afterMethod() { System.out.println("add end..."); } /** * 这里用到了反射 * <p> * o 代理对象 * <p> * method 目标方法 * <p> * objects 目标方法里面参数列表 */ @Override public Object invoke(Object o, Method method, Object[] objects) throws Throwable { beforeMethod(); method.invoke(target, objects); //System.out.println(method.getName()); afterMethod(); return null; }}
/** * 客户端测试类 */ public class Test { public static void main(String[] args) { IUserDao userDao = new UserDaoImpl(); LogEmbed log = new LogEmbed(); log.setTarget(userDao); /** * 根据实现的接口产生代理 */ IUserDao userDaoProxy = (IUserDao) Proxy.newProxyInstance(userDao .getClass().getClassLoader(), userDao.getClass() .getInterfaces(), log); /** * 使用代理对象userDaoProxy调用add方法 */ userDaoProxy.add(new User("张三", "123")); } }
4、总结
代理模式好处:
(1)一个代理类调用原有的方法,且对产生的结果进行控制。
(2)可以将功能划分的更加清晰,有助于后期维护。
阅读全文
0 0
- java设计模式-代理模式
- Java设计模式-----代理模式
- java设计模式-代理模式
- java设计模式---代理模式
- java设计模式---代理模式
- java设计模式---代理模式
- Java设计模式-代理模式
- Java 设计模式 代理模式
- Java设计模式-代理模式
- java设计模式-代理模式
- Java设计模式:代理模式
- java设计模式-----代理模式
- java 设计模式-代理模式
- java设计模式:代理模式
- java设计模式---代理模式
- java设计模式--代理模式
- java设计模式--代理模式
- java设计模式:代理模式
- LeetCode: 476. Number Complement
- 万能地图下载器矢量标注功能特性
- Java语言基础{Java_se(02)}-字面量和常量-变量的基本定义和使用-Java表达式-数据类型和分类-基本数据类型的转换-算数运算符-赋值运算符-比较运算符-三元运算符-逻辑运算符
- Effective Java(一)—— 创建和销毁对象
- 创建第一个线程
- Java设计模式-代理模式
- TP分页类优化 css代码
- webpack细节点记录
- 39. Combination Sum
- Android 广告条轮播的实现
- Jeddict1:简述
- POJ 2393:Yogurt Factory
- 根据数组中对象的某一个属性值进行排序
- shell--符号