Java 23种设计模式之代理模式
来源:互联网 发布:虹越400官网和淘宝店 编辑:程序博客网 时间:2024/06/05 20:04
代理模式就是多一个代理类出来,替原对象进行一些操作,比如我们在租房子的时候回去找中介,为什么呢?因为你对该地区房屋的信息掌握的不够全面,希望找一个更熟悉的人去帮你做,此处的代理就是这个意思。
代理模式分为三种
- 静态代理
- 动态代理
- cglib代理
1. 创建一个实体类
public class Person implements Personable{ @Override public void eat() { System.out.println("eat 吃饭"); }}
2. 定义一个接口
public interface Personable { void eat();}
3. 静态代理实现
持有该对象的引用 实现接口方法 调用该对象的方法
public class StaticProxy implements Personable{ private Person p; public StaticProxy(){ p = new Person(); } @Override public void eat() { System.out.println("刷牙洗脸打豆豆"); p.eat(); System.out.println("洗澡睡觉抱媳妇"); }}
4. 动态代理实现
/** * Created by Administrator on 2017/8/6. * 创建动态代理对象 * 动态代理不需要实现接口,但是需要指定接口类型 */public class DynamicProxy { //维护一个目标对象 private Object target; public DynamicProxy(Object target){ this.target = target; } //给目标对象生成代理对象 public Object getProxy(){ return Proxy.newProxyInstance( target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("刷牙洗脸打豆豆"); Object invoke = method.invoke(target, args); System.out.println("洗澡睡觉抱媳妇"); return invoke; } } ); }}
5. cglib代理实现
需要加入一个cglib-nodep-2.2.jar的架包
/** * Created by Administrator on 2017/8/6. * 目标对象 不需要实现接口 */public class User { public void eat(){ System.out.println("eat 吃饭"); }}//cglib代理类public class CglibProxy implements MethodInterceptor { //维护目标对象 private Object target; public CglibProxy(Object target){ this.target = target; } //给目标对象创建一个代理对象 public Object getProxyInstance(){ //工具类 Enhancer enhancer = new Enhancer(); //设置父类 enhancer.setSuperclass(target.getClass()); //设置回调函数 enhancer.setCallback(this); //创建代理对象 return enhancer.create(); } @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { System.out.println("刷牙洗脸打豆豆"); //执行目标对象方法 Object invoke = method.invoke(target, objects); System.out.println("洗澡睡觉抱媳妇"); return invoke; }}
6. 测试类
public class ProxyTest { //静态代理 @Test public void test1(){ Personable proxy = new StaticProxy(); proxy.eat(); } //动态代理 @Test public void test2(){ Personable p = new Person(); System.out.println(p.getClass()); //不能传Person对象 需要指定接口类型Personable Personable p1 = (Personable) new DynamicProxy(p).getProxy(); System.out.println(p1.getClass()); p1.eat(); } //cglib代理 @Test public void test3(){ Person p = new Person(); System.out.println(p.getClass()); Person p1 = (Person) new CglibProxy(p).getProxyInstance(); System.out.println(p1.getClass()); p1.eat(); }}
阅读全文
0 0
- Java 23种设计模式之代理模式
- 23种设计模式之代理模式
- 23种设计模式之代理模式
- 23种设计模式之代理模式
- 23种设计模式之代理模式
- Java设计模式之代理设计模式
- Java设计模式之代理
- Java设计模式之代理
- java设计模式之代理
- java之代理设计模式
- java之代理设计模式
- Java设计模式之代理模式
- Java设计模式之计数代理模式
- JAVA设计模式之代理模式
- JAVA设计模式之代理模式
- java设计模式之代理模式
- Java 设计模式 之 代理模式
- java设计模式之代理模式Proxy
- VS2017中添加QWebEngineView模块
- shoeBox超实用的雪碧图(Sprite)图制作工具-使用shoeBox
- 百度之星2017资格赛1003[度度熊与邪恶大魔王]
- alsa库的移植
- MySQL事务相关
- Java 23种设计模式之代理模式
- IOS开发之深拷贝与浅拷贝(mutableCopy与Copy)详解
- ReactNative Image组件详解
- keras中ImageDataGenerator用法
- http和https
- 543. Diameter of Binary Tree
- elasticsearch环境搭建
- ssh key生成及GIT远程仓库的建立
- Educational Codeforces Round 26:C. Two Seals