9.3.4: 常见设计模式精讲---代理模式
2014-02-26 08:53
357 查看
第一种:
![](http://images.cnitblog.com/i/527500/201403/191312030378722.jpg)
Image.java:
BigImage.java:
ImageProxy.java:
BigImageTest.java:
第二种:
![](http://images.cnitblog.com/i/527500/201403/191316142872965.jpg)
Dog:
GunDog:
TxUtil.java:
MyInvocationHandler.java:
MyProxyFactory.java:
ProxyTest.java:
控制台输出:
![](http://images.cnitblog.com/i/527500/201403/191312030378722.jpg)
Image.java:
public interface Image { void show(); }
BigImage.java:
public class BigImage implements Image { public BigImage(){ try { Thread.sleep(3000); System.out.println("图片装载成功"); } catch (InterruptedException e) { e.printStackTrace(); } } @Override public void show() { System.out.println("绘制实际的大图片"); } }
ImageProxy.java:
public class ImageProxy implements Image { private Image image; public ImageProxy(Image image){ this.image=image; } @Override public void show() { if(image==null){ image=new BigImage(); } image.show(); } }
BigImageTest.java:
public class BigImageTest { public static void main(String[] args) { long start=System.currentTimeMillis(); Image image=new ImageProxy(null); System.out.println("系统得到Image对象的系统开销:"+(System.currentTimeMillis()-start)); image.show(); } }
第二种:
![](http://images.cnitblog.com/i/527500/201403/191316142872965.jpg)
Dog:
public interface Dog { public void info(); public void run(); }
GunDog:
public class GunDog implements Dog { @Override public void info() { System.out.println("我是一只猎狗"); } @Override public void run() { System.out.println("我奔跑迅速"); } }
TxUtil.java:
public class TxUtil { public void beginTX(){ System.out.println("开始事务"); } public void endTx(){ System.out.println("结束事务"); } }
MyInvocationHandler.java:
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class MyInvocationHandler implements InvocationHandler { private Object target; public void setTarget(Object target){ this.target=target; } @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; } }
MyProxyFactory.java:
import java.lang.reflect.Proxy; public class MyProxyFactory { public static Object getProxy(Object target){ MyInvocationHandler handler=new MyInvocationHandler(); handler.setTarget(target); return Proxy.newProxyInstance( target.getClass().getClassLoader(),target.getClass().getInterfaces(),handler); } }
ProxyTest.java:
public class ProxyTest { public static void main(String[] args) { Dog target=new GunDog(); Dog dog=(Dog) MyProxyFactory.getProxy(target); dog.info(); System.out.println("------------"); dog.run(); } }
控制台输出:
![](http://images.cnitblog.com/i/527500/201403/191324030683516.jpg)
相关文章推荐
- 9.3.5: 常见设计模式精讲---命令模式
- Java中的线程Thread总结
- 9.3.3: 常见设计模式精讲---工厂方法和抽象工厂
- Windows Server2003防木马权限设置IIS服务器安全配置整理
- 在基于对话框的程序中高级定制Web控件
- Java中的线程Thread方法之---interrupt()
- 9.3.2: 常见设计模式精讲---简单工厂
- ubuntu 12.04 命令行不显示用户名和路径了
- Java中的对象Object方法之---wait()和notifiy()
- 基于模板的通用代码生成器LKGenerator(一)-发布和主要功能介绍
- 9.3.1: 常见设计模式精讲---单例模式
- g++参数介绍
- 韩剧是女人的A片
- sharepoint 2013创建外部内容类型并创建外部列表
- 抽象语法树
- 9.2.3: 如何面对挑战---选择性地扩展
- 9.2.4: 如何面对挑战---使用代码生成器
- 9.2.2: 如何面对挑战---利用优秀的框架
- js 赋值 包含 单引号 双引号 解决方法
- 9.2.1: 如何面对挑战---使用建模工具