设计模式系列——代理模式

559 阅读2分钟

原创:花括号MC(微信公众号:huakuohao-mc),欢迎分享,转载请保留出处。 代理模式和日常生活中的代理是一个意思,即创建一个代理类,代替真实的业务类完成核心的业务场景。代理模式可以隐藏真实的业务类细节,代理类甚至还可以在核心业务开始和结束时,执行一些记录操作,类似于我们经常使用的AOP

举个例子

我们有个加载图片并展示的功能,不希望把加载图片的细节对外展示,并且希望统计每次加载图片一共花费了多少时间,这个时候我们可以考虑使用代理模式。

先看一下UML图:

proxy.png

再来看一下具体代码是怎么实现的

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…

推荐阅读

1. Java并发编程那些事儿(十)——最后的总结

2. 程序员应该掌握的常用网络问题定位工具

3. Awk这件上古神兵你会用了吗

4. 手把手教你搭建一套ELK日志搜索运维平台

原创:花括号MC(微信公众号:huakuohao-mc)。关注JAVA基础编程及大数据,注重经验分享及个人成长。