代理模式
代理模式 参考了iteye网友的一篇文章《java设计模式之——代理模式》
以下代码根据该思想改编
接口
public interface KindWoman {
public void makeEyesWithMan();
public void happyWithMan();
}
实现类
public class Beauty implements KindWoman {
@Override
public void happyWithMan() {
System.out.println("游戏...");
}
@Override
public void makeEyesWithMan() {
System.out.println("抛媚眼...");
}
}
代理类
public class UglyWoman implements KindWoman {
private KindWoman kindWoman;
public UglyWoman() {
this.kindWoman = new Beauty();
}
// 她可以是KindWomam的任何一个女人的代理,只要你是这一类型
public UglyWoman(KindWoman kindWoman) {
this.kindWoman = kindWoman;
}
@Override
public void happyWithMan() {
this.kindWoman.happyWithMan();// 找人代理
}
@Override
public void makeEyesWithMan() {
this.kindWoman.makeEyesWithMan();// 找人代理
}
}
客户端代码
public static void main(String[] args) {
KindWoman woman = new UglyWoman();
woman.makeEyesWithMan();
woman.happyWithMan();
}
处理延时加载
将代理类进行改造
public class UglyWoman implements KindWoman { private KindWoman kindWoman; public UglyWoman() { this.kindWoman = new Beauty(); } // 她可以是KindWomam的任何一个女人的代理,只要你是这一类型 public UglyWoman(KindWoman kindWoman) { this.kindWoman = kindWoman; } @Override public void happyWithMan() { if (kindWoman == null) { kindWoman = new Beauty(); } this.kindWoman.happyWithMan();// 找人代理 } @Override public void makeEyesWithMan() { if (kindWoman == null) { kindWoman = new Beauty(); } this.kindWoman.makeEyesWithMan();// 找人代理 } }
public class Beauty implements KindWoman { //加入时间检测 public Beauty() { try { Thread.sleep(3000); System.out.println("准备"); } catch (InterruptedException e) { e.printStackTrace(); } } @Override public void happyWithMan() { System.out.println("游戏..."); } @Override public void makeEyesWithMan() { System.out.println("抛媚眼..."); } }
客户端调用
long currentTimeMillis = System.currentTimeMillis(); KindWoman woman = new UglyWoman(null); long currentTimeMillis2 = System.currentTimeMillis(); System.out.println(currentTimeMillis2 - currentTimeMillis); woman.makeEyesWithMan();//在调用具体的方法时,new一个新的对象 woman.happyWithMan();
输出结果:
0 -- 休眠3秒,输出“准备” |
提供额外的功能:AOP 动态代理
public interface Dog { public void info(); public void run(); }
public class GunDog implements Dog { @Override public void info() { System.out.println("我是一只猎狗"); } @Override public void run() { System.out.println("我奔跑迅速"); } }
需要切入的代码
public class TxUtil { public void beginTx() { System.out.println("===模拟开始事务===="); } public void endTx() { System.out.println("===模拟结束事务===="); } }
代理类
public class MyInvokationHandler implements InvocationHandler { //需要被代理的对象 private Object target; public void setTarget(Object target) { this.target = target; } //执行动态代理对象的所有方法时,都会被替换成执行如下的invoke方法 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { TxUtil tx = new TxUtil(); tx.beginTx(); Object result = method.invoke(target, args); tx.endTx(); return result; } }
/** * 为指定的target生成动态代理实例 * */ public class MyProxyFactory { public static Object getProxy(Object target) { MyInvokationHandler handler = new MyInvokationHandler(); handler.setTarget(target); // 创建并返回一个动态代理 return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), handler); } }
客户端调用类
public static void main(String[] args) { Dog target = new GunDog(); Dog dog = (Dog) MyProxyFactory.getProxy(target); dog.info(); dog.run(); }
输出结果:
===模拟开始事务==== 我是一只猎狗 ===模拟结束事务==== ===模拟开始事务==== 我奔跑迅速 ===模拟结束事务==== |
这种动态代理在AOP(面向切面编程)里被称为AOP代理,AOP代理可代理目标对象,包含了目标对象的全部方法,并且可以在执行目标方法之前、之后插入一些通用处理。
Spring所创建的AOP代理就是这种动态代理,通过配置文件来决定invoke()方法中需要调用哪些拦截器。
当程序需要为目标对象扩展新功能时,无需改变java代理,在配置文件中添加更多的拦截器配置即可。
代理模式的优势及使用场景:
客户端代码不能或者不想直接访问被调用对象:比如,创建系统开销很大的对象(延时加载),或者被调用的对象在远程主机上,或者目标对象的功能不能满足需求,这时候就需要创建一个代理对象,返回给客户端使用。
相关推荐
JAVA-设计模式-结构型模式-代理模式
c++设计模式-结构型模式-代理模式,qt工程,c++源码,简单示例
动态代理设计模式-源码
设计模式-代理模式(讲解及其实现代码)
java常用设计模式-代理模式
设计模式专题之(六)代理模式---设计模式代理模式示例代码(python--c++)
ios平台下的代理模式设计实现,最简单的实现,重写了方法签名,信息派发,blog:http://blog.sina.com.cn/s/blog_161d504630102wwvp.html
Java 设计模式 代理模式介绍,含源码
Java设计模式,代理模式,包含动态代理的Demo,具体的思想与实现有很多讲得很好的老师,我是看厉风行老师的视频学的,讲得不错,简单易懂
设计模式10-代理模式、结构型模式大复习 设计模式11-行为模式-责任链、命令模式 设计模式12-解释器模式 设计模式13-迭代器模式 设计模式14-中介者模式、备忘录模式 设计模式15-观察者模式、状态模式 设计模式16-策略...
自己写的Java的代理模式的实现,有兴趣的可以下载看看
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、...
1.1 什么是设计模式 2 1.2 Smalltalk MVC 中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决设计问题 8 1.6.1 寻找合适的对象 8 1.6.2 决定对象的粒度 9 1.6.3 指定对象...
java设计模式,设计模式公司出品。策略模式,代理模式,单例模式,多例模式,工厂模式,门面模式等。
java模式设计-代理模式之动态代理.ppt
java设计模式视频教程-代理模式, 深层了解java的设计模式
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、...
设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段...
本系统使用Java代码实现,是设计模式的期末课程设计,共使用了5种设计模式,分别是**原型模式、单例模式、抽象工厂模式、代理模式、建造者模式。*,希望对各位有帮助