代理模式


文章目录

  • 代理模式
    • 1. 介绍
      • 优点
      • 缺点
      • 注意
    • 2. 例子
    • 3. 总结


代理模式


1. 介绍

代理模式(Proxy Pattern)是一种结构型模式。代理模式就是为对象创建它的代理对象类控制对对象的访问。

简单理解:和现实中的代理人一样,如果一个人有代理人,那么你想要拜访这个人,你首先是需要和他的代理人打交道,这样就控制了你对他本人的直接访问。


优点

  1. 控制对对象的访问。由于对象的代理的存在,访问对象需要去访问它的代理对象,从而间接的访问对象,那么,就可以用代理对象来控制对被代理对象访问。
  2. 职责清晰。代理对象就是用来控制对被代理对象的访问,它不做其他多余的工作,职责比较清晰。

缺点

  1. 可能会降低访问对象速度。由于要经过代理对象,所以可能会降低访问被代理对象的速度。

注意

  1. 代理模式和适配器模式的区别:适配器模式主要改变目标对象的接口,而代理模式不能改变所代理类的接口。
  2. 代理模式和装饰器模式的区别:装饰器模式为了增强功能,而代理模式是为了对被代理对象的访问加以控制。

2. 例子

有一个Image接口,照片类实现了这个接口,照片类的代理类也实现了这个接口,代理类会先将照片加载,然后展示出来,如果想要下载这个图片,还需要输入密码。


类图:
代理模式_第1张图片


Image接口:
照片接口,RealImage和ProxyImage这两个类都实现了这个接口。

package proxyPattern;

public interface Image {
     
    public void display();
}

照片类:
代表的是照片,实现了Image接口。

package proxyPattern;

public class RealImage implements Image {
     
    private String imageName;

    public RealImage(String imageName) {
     
        super();
        this.imageName = imageName;
    }

    @Override
    public void display() {
     
        System.out.println(String.format("%s显示出来了", imageName));
    }
    
    public void loadFromDesk() {
     
        System.out.println("正在将图片"+imageName+"从磁盘中加载...");
    }

}

代理类:
是RealImage类的代理类,用于控制对RealImage对象的访问。

package proxyPattern;

public class ProxyImage implements Image {
     
    //代理模式强调的是对 被代理对象的访问 的控制
    private String fileName;
    private RealImage realImage;

    public ProxyImage(String imageName) {
     
        super();
        this.fileName = imageName;
    }

    @Override
    public void display() {
     
        if (realImage == null) {
     
            realImage = new RealImage(fileName);
        }
        realImage.loadFromDesk();
        realImage.display();
    }

    public Image download(String password) {
     
        if(password.equals("123456")) {
     
            return realImage;
        }else {
     
            return null;
        }
    }
}

测试类:

package proxyPattern;

import org.junit.Test;

public class TestJ {
     
    @Test
    public void test1() {
     
        ProxyImage proxyImage = new ProxyImage("test.png");
        proxyImage.display();
        
        Image downloadImage = proxyImage.download("123456");
        if(downloadImage instanceof RealImage) {
     
            System.out.println("照片下载成功!");
        }else {
     
            System.out.println("照片下载失败!");
        }
    }
}

运行结果:

正在将图片test.png从磁盘中加载...
test.png显示出来了
照片下载成功!

3. 总结

代理模式通过对象的代理对象(中间人)来控制对被代理对象的访问,侧重于对对象访问的控制。

你可能感兴趣的:(设计模式,设计模式,Proxy,Pattern,代理模式,代理模式介绍)