博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式 - 结构型 - 代理模式
阅读量:5885 次
发布时间:2019-06-19

本文共 2450 字,大约阅读时间需要 8 分钟。

hot3.png

介绍

意图:为另一个对象提供一个替身或占位符以控制对这个对象的访问。

主要解决:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层。

何时使用:想在访问一个类时做一些控制。

如何解决:增加中间层。

关键代码:实现与被代理类组合。

proxy1.png

实现

一个模拟加载图片实现类

基本实现

public interface Image {	void display();}

被代理类

public class RealImage implements Image {	private String fileName;	public RealImage(String fileName) {		this.fileName = fileName;	}	[@Override](https://my.oschina.net/u/1162528)	public void display() {		System.out.println("Displaying " + fileName);				try {			Thread.sleep(666);		} catch (InterruptedException e) {			e.printStackTrace();		}			}}

代理类——用来计算diplay()耗费时间

public class ProxyImage implements Image {	private RealImage realImage;	private String fileName;	public ProxyImage(String fileName) {		this.fileName = fileName;	}	[@Override](https://my.oschina.net/u/1162528)	public void display() {				long begin = System.currentTimeMillis();				if (realImage == null) {			realImage = new RealImage(fileName);		}				realImage.display();				long end = System.currentTimeMillis();				System.out.println("It's spent " + (end - begin)+ "ms");			}}

运行类

public class ProxyPatternDemo {	public static void main(String[] args) {		Image image = new ProxyImage("18stop.jpg");		image.display();	}}

运行结果

Displaying 18stop.jpgIt's spent 670ms

JDK动态代理

proxy2.png

import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import designpattern.proxy.example1.Image;import designpattern.proxy.example1.RealImage;public class TimerHandler implements InvocationHandler {	private Object target;		public TimerHandler(Object target) {		this.target = target;	}		[@Override](https://my.oschina.net/u/1162528)	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {				long begin = System.currentTimeMillis();				Object obj = method.invoke(target, args);				long end = System.currentTimeMillis();		System.out.println("It's spent " + (end - begin)+ "ms");				return obj;	}		public static void main(String[] args) {		RealImage image = new RealImage("18stop.jpg");				TimerHandler timer = new TimerHandler(image);				Image proxyImage = (Image)Proxy.newProxyInstance(				image.getClass().getClassLoader(), 				image.getClass().getInterfaces(), 				timer);				proxyImage.display();			}}

运行结果

Displaying 18stop.jpgIt's spent 675ms

参考及引用

1.《Head First 设计模式》Eric Freeman 等 著

转载于:https://my.oschina.net/jallenkwong/blog/1795490

你可能感兴趣的文章
麦子学院与阿里云战略合作 在线教育领军者技术实力被认可
查看>>
正确看待大数据
查看>>
Facebook通过10亿单词构建有效的神经网络语言模型
查看>>
发展大数据不能抛弃“小数据”
查看>>
中了WannaCry病毒的电脑几乎都是Win 7
查看>>
学生机房虚拟化(九)系统操作设计思路
查看>>
nginx报错pread() returned only 0 bytes instead of 4091的分析
查看>>
质数因子
查看>>
Spring源码浅析之事务(四)
查看>>
[转载] Live Writer 配置写 CSDN、BlogBus、cnBlogs、163、sina 博客
查看>>
SQL:连表查询
查看>>
MySQL日期函数、时间函数总结(MySQL 5.X)
查看>>
c语言用尾插法新建链表和输出建好的链表
查看>>
高性能 Oracle JDBC 编程
查看>>
java 中ResultSet可以获取的数据类型及返回值类型列表
查看>>
ubuntu 13 安装SH程序
查看>>
支付宝升级延时到账功能
查看>>
ghost后只剩下一个盘的数据寻回方法
查看>>
输入输出练习
查看>>
Git commit message和工作流规范
查看>>