每日设计模式之代理模式

为其他对象提供一种代理以控制对这个对象的访问。

代理模式:
代理和被代理的对象有着相同的行为,而被代理的对象通过和代理实现(合成)组合的关系,然后通过代理展示相应的行为。

下面给出代码示例(代码取至维基百科):
代码解释:(你可以先看代码)

  1. 我们首先需要定义一个接口,用于设定被代理对象的方法。
  2. 代理和被代理对象都实现该接口,在被代理对象中的构造器实现正常的事务(即从硬盘中装载图像),而在代理中的构造器不装载图像,在调用代理实现接口的方法时,实例化被代理对象,然后通过被代理对象调用其方法,就可以达到代理对象。
import java.util.*;

interface Image {
    public void displayImage();
}

//on System A 
class RealImage implements Image {
    private String filename;
    public RealImage(String filename) { 
        this.filename = filename;
        loadImageFromDisk();
    }

    private void loadImageFromDisk() {
        System.out.println("Loading   " + filename);
    }

    public void displayImage() { 
        System.out.println("Displaying " + filename); 
    }
}

//on System B 
class ProxyImage implements Image {
    private String filename;
    private Image image;

    public ProxyImage(String filename) { 
        this.filename = filename; 
    }
    public void displayImage() {
        if(image == null)
              image = new RealImage(filename);
        image.displayImage();
    }
}

class ProxyExample {
    public static void main(String[] args) {
        Image image1 = new ProxyImage("HiRes_10MB_Photo1");
        Image image2 = new ProxyImage("HiRes_10MB_Photo2");     

        image1.displayImage(); // loading necessary
        image2.displayImage(); // loading necessary
    }
}
程序的输出为:

Loading    HiRes_10MB_Photo1
Displaying HiRes_10MB_Photo1
Loading    HiRes_10MB_Photo2
Displaying HiRes_10MB_Photo2

代理模式的应用

  1. 远程代理:为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在与不同地址空间的事实。
  2. 虚拟代理:是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。这样就可以达到性能的最优化,比如说你打开一个很大的HTML网页时,里面可能有很多的文字和图片,但是你还是可以很快打开它,此时你所看到的是所有的文字,但是图片确实一张一张地下载后才能看到,,那些未打开的图片框,就是通过虚拟代理来替代了真实的图片,此时代理存储了真实图片的路径和尺寸(浏览器就是用代理模式优化下载的)。
  3. 安全代理:用来控制真实对象访问时的权限。一般用于对象应该有不同的访问权限的时候。
  4. 智能指引:是指当调用真实对象时,代理处理另一些事情。如计算真实对象的引用次数,或是访问一个实际对象之前,检查是否已经锁定它,以确保其他对象不能改变它。他们都是通过代理在访问一个对象时附加一些内务处理。

    代理模式其实就是在访问对象时引入一定程度的间接性。

猜你喜欢

转载自blog.csdn.net/m0_37884977/article/details/79633794