您的位置:首页 > 其它

代理模式

2016-03-10 23:23 351 查看
如果客户端代码不能或不想直接访问被调用对象——这种情况有很多原因,比如需要创建一个系统开销很大的对象,或者被调用对象在远程主机上,或者目标对象功能还不足以满足需求…..而是额外创建一个对象返回给客户端使用,那么这种设计方式就是代理模式。如下给出了UML类图。



下面笔者给出了实现的方法。

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) 执行结果。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: