java设计模式——装饰者模式(代理模式)
2016-04-09 00:00
459 查看
遵循的原则:类应该对扩展开放,对修改关闭。
装饰者模式:http://blog.csdn.net/lmj623565791/article/details/24269409
这个IEquipDecorator接口可有可无(拓展用),装饰类也可以直接实现IEquip接口。
=======================================================================
代理模式:http://yangguangfu.iteye.com/blog/815787
=============================================================================
JDK的动态代理:http://ysj5125094.iteye.com/blog/2054620
// 实例化目标对象
Hello h = new HelloImpl() ;
// 实例化InvocationHandler
MyInvocationHandler myInvocationHandler = new MyInvocationHandler(h);
// 根据目标对象生成代理对象
Hello proxy = Proxy.newProxyInstance(h.getClass().getClassLoader(), h.getClass().getInterfaces(), myInvocationHandler);
注意此处的h必须要有接口,即jdk的动态代理只能对接口产生代理,非接口要使用CGLIB。
内部原理:
代理类proxy有所有的接口里的方法,每个方法的实现都是调用myInvocationHandler的invoke方法:
h.invoke(this,此方法名)
myInvocationHandler持有被代理类,再由myInvocationHandler的invoke通过反射调用被代理类对应的方法。
public void invoke(Object o, Method m) {
long starttime = System.currentTimeMillis();
System.out.println("汽车开始行驶....");
m.invoke(target(持有的被代理类)); //通过这个方法调用被代理类的方法
long endtime = System.currentTimeMillis();
System.out.println("汽车结束行驶.... 汽车行驶时间:"
+ (endtime - starttime) + "毫秒!");
}
这个invoke是暴露给我们的,所以可以任意在 m.invoke(target)前后加修饰方法。
装饰者模式:http://blog.csdn.net/lmj623565791/article/details/24269409
这个IEquipDecorator接口可有可无(拓展用),装饰类也可以直接实现IEquip接口。
=======================================================================
代理模式:http://yangguangfu.iteye.com/blog/815787
//接口 public interface Moveable { void move(); }
//汽车类 public class Car implements Moveable { @Override public void move() { //实现开车 try { Thread.sleep(new Random().nextInt(1000)); System.out.println("汽车行驶中...."); } catch (InterruptedException e) { e.printStackTrace(); } } }
//汽车类的代理类 public class CarTimeProxy implements Moveable { public CarTimeProxy(Moveable m) { super(); this.m = m; } private Moveable m; @Override public void move() { long starttime = System.currentTimeMillis(); System.out.println("汽车开始行驶...."); m.move(); long endtime = System.currentTimeMillis(); System.out.println("汽车结束行驶.... 汽车行驶时间:" + (endtime - starttime) + "毫秒!"); } }
=============================================================================
JDK的动态代理:http://ysj5125094.iteye.com/blog/2054620
// 实例化目标对象
Hello h = new HelloImpl() ;
// 实例化InvocationHandler
MyInvocationHandler myInvocationHandler = new MyInvocationHandler(h);
// 根据目标对象生成代理对象
Hello proxy = Proxy.newProxyInstance(h.getClass().getClassLoader(), h.getClass().getInterfaces(), myInvocationHandler);
注意此处的h必须要有接口,即jdk的动态代理只能对接口产生代理,非接口要使用CGLIB。
内部原理:
代理类proxy有所有的接口里的方法,每个方法的实现都是调用myInvocationHandler的invoke方法:
h.invoke(this,此方法名)
myInvocationHandler持有被代理类,再由myInvocationHandler的invoke通过反射调用被代理类对应的方法。
public void invoke(Object o, Method m) {
long starttime = System.currentTimeMillis();
System.out.println("汽车开始行驶....");
m.invoke(target(持有的被代理类)); //通过这个方法调用被代理类的方法
long endtime = System.currentTimeMillis();
System.out.println("汽车结束行驶.... 汽车行驶时间:"
+ (endtime - starttime) + "毫秒!");
}
这个invoke是暴露给我们的,所以可以任意在 m.invoke(target)前后加修饰方法。
相关文章推荐
- 设计模式--备忘录模式
- 设计模式--观察者模式
- 设计模式--原型模式
- 设计模式--代理模式
- 设计模式--状态模式
- 设计模式--策略模式
- 设计模式--模板方法模式
- 设计模式--访问者模式
- 设计模式--总结
- File相关(创建文件及目录)
- springMVC 和ajax 最先进数据交互方式和 406错误处理
- eclipse中green UML 自动生成类图
- day28-struts2( struts架构分析,ognl表达式,ognl表达式)
- java枚举类型的用法
- JAVA 学习 自我总结
- Ubuntu 14.04 LTS中jdk的安装
- 内存分配与回收策略
- 《JAVA并发编程实践》学习笔记(第八.九章)
- SpringMVC学习记录(七)--拦截器的使用
- 华为2016校园招聘题----[编程题]简单错误记录(JAVA版)