代理模式
2016-03-10 23:23
351 查看
如果客户端代码不能或不想直接访问被调用对象——这种情况有很多原因,比如需要创建一个系统开销很大的对象,或者被调用对象在远程主机上,或者目标对象功能还不足以满足需求…..而是额外创建一个对象返回给客户端使用,那么这种设计方式就是代理模式。如下给出了UML类图。
下面笔者给出了实现的方法。
1) Image接口类。
2) BigImage类。
3) ImageProxy类。
4) BigImageTest类。
5) 执行结果。
下面笔者给出了实现的方法。
1) Image接口类。
public interface Image { void show(); }
2) BigImage类。
public class BigImage implements Image { public BigImage() { try { // 程序暂停3s模式模拟系统开销 Thread.sleep(3000); System.out.println("图片装载成功..."); } catch (InterruptedException ex) { ex.printStackTrace(); } } // 实现Image里的show()方法 public void show() { System.out.println("绘制实际的大图片"); } }
3) ImageProxy类。
public class ImageProxy implements Image { // 组合一个image实例,作为被代理的对象 private Image image; // 使用抽象实体来初始化代理对象 public ImageProxy(Image image) { this.image = image; } /** * 重写Image接口的show()方法 * 该方法用于控制对被代理对象的访问, * 并根据需要负责创建和删除被代理对象 */ public void show() { // 只有当真正需要调用image的show方法时才创建被代理对象 if (image == null) { image = new BigImage(); } image.show(); } }
4) BigImageTest类。
public class BigImageTest { public static void main(String[] args) { long start = System.currentTimeMillis(); // 程序返回一个Image对象,该对象只是BigImage的代理对象 Image image = new ImageProxy(null); System.out.println("系统得到Image对象的时间开销:" + (System.currentTimeMillis() - start)); // 只有当实际调用image代理的show()方法时,程序才会真正创建被代理对象。 image.show(); } }
5) 执行结果。
相关文章推荐
- iOS两个关于对象的关键字
- 首次在公司内部的分享
- UVa 1354 Mobile Computing[暴力枚举]
- leetcode:Valid Palindrome 【Java】
- ajax地址三级联动下拉表
- A. Robot Sequence
- 结构体对齐详解http://www.cnblogs.com/motadou/archive/2009/01/17/1558438.html
- shell
- 谈谈jvm内存分配和管理
- easyUI datagrid笔记
- PF_INET 和 AF_INET的区别
- struts-dojo的使用
- mysql5.7在win下安装
- uva 558 tree(不忍吐槽的题目名)——yhx
- 第三次作业--致面临崩溃的自己
- UVA 12166 Equilibrium Mobile 修改天平
- struts2发送邮件
- 抽象工厂
- mysql 查询输出到文本
- 关于批量插入数据(100万级别的数据,mysql)