原创:花括号MC(微信公众号:huakuohao-mc),欢迎分享,转载请保留出处。 代理模式和日常生活中的代理是一个意思,即创建一个代理类,代替真实的业务类完成核心的业务场景。代理模式可以隐藏真实的业务类细节,代理类甚至还可以在核心业务开始和结束时,执行一些记录操作,类似于我们经常使用的
AOP。
举个例子
我们有个加载图片并展示的功能,不希望把加载图片的细节对外展示,并且希望统计每次加载图片一共花费了多少时间,这个时候我们可以考虑使用代理模式。
先看一下UML图:
再来看一下具体代码是怎么实现的
public interface Image {
void display();
}
真正的完成核心业务的类
public class RealImage implements Image {
private String fileName;
public RealImage(String fileName) throws InterruptedException {
this.fileName = fileName;
loadFromDisk(fileName);
}
@Override
public void display() {
System.out.println("Displaying " + fileName);
}
private void loadFromDisk(String fileName) throws InterruptedException {
System.out.println("Loading " + fileName);
Thread.sleep((long) (Math.random()*100));
}
}
代理类,除了完成主要业务逻辑,还增加了加载图片的时间统计功能。
public class ProxyImage implements Image {
private RealImage realImage;
private String fileName;
public ProxyImage(String fileName) {
this.fileName = fileName;
}
@Override
public void display() throws InterruptedException {
if (realImage == null){
long startTime = System.currentTimeMillis();
realImage = new RealImage(fileName);
long endTime = System.currentTimeMillis();
long spendTime = endTime - startTime;
System.out.println("加载图片花费了: " + spendTime );
}
realImage.display();
}
}
看一下客户端如何使用
public class ProxyPatternDemo {
public static void main(String[] args) throws InterruptedException {
//使用代理类
Image image = new ProxyImage("test_10mb.jpg");
//图片被加载并统计加载时间,所有细节全部被隐藏
image.display();
System.out.println("");
}
}
总结
代理模式是结构型模式之一,日常使用的频率比较高,最典型的应用就是AOP,日志记录等功能。
本文参考 www.tutorialspoint.com/design_patt…
推荐阅读
原创:花括号MC(微信公众号:huakuohao-mc)。关注JAVA基础编程及大数据,注重经验分享及个人成长。