代理模式

一个类代表另一个类的功能。在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。可以理解为内存中没有这个对象就创建,有就直接返回这个对象。

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

以获取磁盘中的图片为例,总共分三步:

  • 1、创建一个接口。

    public interface Image {
       void display();
    }
  • 2、创建实现接口的实体类 RealImage。对应代理类:ProxyImage。

    public class RealImage implements Image {
    
        private String fileName;
    
        public RealImage(String fileName) {
            this.fileName = fileName;
            loadFromDisk(fileName);
        }
    
        private void loadFromDisk(String fileName) {
            Log.e("RealImage", "loading " + fileName);
        }
    
        @Override
        public void display() {
            Log.e("RealImage", "Displaying " + fileName);
        }
    }
    public class ProxyImage implements Image {
    
        private String fileName;
        private RealImage realImage;
    
        public ProxyImage(String fileName) {
            this.fileName = fileName;
        }
    
        @Override
        public void display() {
            if (realImage == null) {
                realImage = new RealImage(fileName);
            }
            realImage.display();
        }
    }
  • 3、当被请求时,使用 ProxyImage 来获取 RealImage 类的对象。

    Image image = new ProxyImage("test_10mb.png");
    // 第一次是new的,图像从磁盘加载
    image.display();
    // 第二次取缓存,图像不需要从磁盘加载
    image.display();
posted @ 2020-08-31 10:09  泥土里的绽放  阅读(143)  评论(0编辑  收藏  举报