标签:引用 创建 stop proxy ring 16px 工作 ide row
作为一个初级开发者,可能不会接触到代理模式,但是在很多框架的使用中都不知不觉使用了代理模式,比如servlet的过滤器链,spring的AOP,以及spring mvc的拦截器等。所以了解代理模式对于个人的成长是不可避免的。
在某些情况下,一个客户不想或者不能直接引用一个对象,此时可以通过一个称之为“代理”的第三者来实现间接引用。代理对象可以在客户端和目标对象之间起到中介的作用,并且可以通过代理对象去掉客户不能看到的内容和服务或者添加客户需要的额外服务。
原文和作者一起讨论:http://www.cnblogs.com/intsmaze/p/6013461.html
新浪微博:intsmaze刘洋洋哥
public interface Moveable { void move(); void stop(); } public class Tank implements Moveable { public void move() { System.out.println("Tank Move"); try { Thread.sleep(new Random().nextInt(10000)); } catch (InterruptedException e) { e.printStackTrace(); } } public void stop() { System.out.println("Tank stop"); } }
public class Tank1 extends Tank { public void move() { System.out.println("time start"); super.move(); System.out.println("time end"); } }
再增加一个功能,记录move的执行前后的日志信息,不能修改源码。
public class Tank2 extends Tank { public void move() { System.out.println("log start"); super.move(); System.out.println("log end"); } }
public class TimeProxy implements Moveable { Moveable m; public TimeProxy(Moveable m) { super(); this.m = m; } public void move() { System.out.println("time start"); m.move(); System.out.println("time end"); } } public class LogProxy implements Moveable { Moveable m; public LogProxy(Moveable m) { super(); this.m = m; } public void move() { System.out.println("log start"); m.move(); System.out.println("log end"); } }
想添加日志功能
public static void main(String[] args) throws Exception { Moveable t = new Tank(); Moveable m=new LogProxy(t); m.move(); }
想先日志再时间,直接在调用处进行组合,不需要创建新的类
public static void main(String[] args) throws Exception { Moveable t = new Tank(); Moveable m=new LogProxy(t); Moveable s=new TimeProxy(m); s.move(); }
如果要对Moveable接口中所有的方法加时间计算
public class TimeProxy implements Moveable { Moveable m; public TimeProxy(Moveable m) { super(); this.m = m; } public void move() { this.before(); m.move(); this.after(); } @Override public void stop() { this.before(); m.stop(); this.after(); } public void before() { System.out.println("time start"); } public void after() { System.out.println("time end"); } }
8小时候,我将讲解代理模式的高阶应用动态代理的实现。
标签:引用 创建 stop proxy ring 16px 工作 ide row
原文地址:http://www.cnblogs.com/intsmaze/p/6013461.html