详解代理模式的根本构造和原理

代理模式是一种罕用的设计模式,它为其余对象提供了一个代理,以管制对这个对象的拜访。代理模式能够用来限度拜访、实现近程拜访、提早加载等性能。在本文中,咱们将具体介绍代理模式的根本构造和原理,并通过一个例子来阐明代理模式的利用。

根本构造

代理模式由三局部组成:形象主题(Subject)、实在主题(RealSubject)和代理(Proxy)。形象主题定义了实在主题和代理的公共接口,实在主题是被代理的对象,代理对象与实在主题实现雷同的接口,以便于代理对象能够代替实在主题,而代理则负责管制对实在主题的拜访。

在代理模式中,客户端不间接拜访实在主题,而是通过代理来拜访实在主题。代理在实现客户申请之前,能够进行一些预处理操作,比方记录日志、验证权限等。代理还能够在拜访实在主题前后进行一些操作,比方缓存数据、提早加载等。

原理解析

代理模式的原理非常简单。客户端通过代理来拜访实在主题,代理先进行一些预处理操作,而后将申请传递给实在主题。实在主题实现申请后,将后果返回给代理。

代理再将后果返回给客户端。代理模式能够用来实现各种性能,比方限度拜访、近程拜访、提早加载等。上面咱们将别离介绍这些利用场景。

限度拜访

代理模式能够用来限度拜访。在这种状况下,代理会对客户申请进行验证,以确保只有具备特定权限的用户能力拜访实在主题。例如,一个网站可能会应用代理来限度对某些页面的拜访,只有登录用户能力拜访这些页面。

上面是一个示例程序:

public interface Subject {    void request();}public class RealSubject implements Subject {    public void request() {        System.out.println("RealSubject.request()");    }}public class Proxy implements Subject {    private Subject realSubject;    private String password;    public Proxy(String password) {        this.password = password;        this.realSubject = new RealSubject();    }    public void request() {        if (password.equals("secret")) {            realSubject.request();        } else {            System.out.println("Access denied");        }    }}public class Client {    public static void main(String[] args) {        Subject subject = new Proxy("secret");        subject.request(); // RealSubject.request()                Subject subject2 = new Proxy("wrong password");        subject2.request(); // Access denied    }}

在这个例子中,咱们定义了一个形象主题接口 Subject 和一个实在主题类 RealSubject。而后咱们定义了一个代理类 Proxy,并在构造函数中传入一个明码参数。当客户端调用 request() 办法时,代理会先查看明码是否正确,而后将申请转发给实在主题。如果明码不正确,代理会回绝拜访。

近程拜访

代理模式能够用来实现近程拜访。在这种状况下,代理对象充当客户端和近程对象之间的中介,客户端只须要晓得代理对象的接口,就能够通过代理对象拜访近程对象。例如,一个应用程序可能须要从另一个应用程序中获取数据,此时能够应用代理模式来进行近程拜访。

上面是一个示例程序:

public interface Subject {    void request();}public class RemoteSubject implements Subject {    public void request() {        System.out.println("RemoteSubject.request()");    }}public class Proxy implements Subject {    private Subject remoteSubject;    public Proxy() {        this.remoteSubject = new RemoteSubject();    }    public void request() {        System.out.println("Proxy.request()");        remoteSubject.request();    }}public class Client {    public static void main(String[] args) {        Subject subject = new Proxy();        subject.request(); // Proxy.request() RemoteSubject.request()    }}

在这个例子中,咱们定义了一个形象主题接口 Subject 和一个近程主题类 RemoteSubject。而后咱们定义了一个代理类 Proxy,并在构造函数中创立一个近程主题对象。当客户端调用 request() 办法时,代理会先输入一条日志,而后将申请转发给近程主题。

提早加载

代理模式还能够用来实现提早加载。在这种状况下,代理对象会在第一次拜访实在主题时才进行初始化,从而防止在程序启动时就加载所有的资源。例如,一个应用程序可能须要加载大量的图片,如果在程序启动时就加载所有的图片,会导致程序变得十分迟缓。此时能够应用代理模式来实现提早加载。

上面是一个示例程序:

public interface Subject {    void request();}public class RealSubject implements Subject {    public RealSubject() {        System.out.println("RealSubject initialized");    }    public void request() {        System.out.println("RealSubject.request()");    }}public class Proxy implements Subject {    private Subject realSubject;    public Proxy() {    }    public void request() {        if (realSubject == null) {            realSubject = new RealSubject();        }        realSubject.request();    }}public class Client {    public static void main(String[] args) {        Subject subject = new Proxy();        subject.request(); // RealSubject initialized RealSubject.request()        subject.request(); // RealSubject.request()    }}

在这个例子中,咱们定义了一个形象主题接口 Subject 和一个实在主题类 RealSubject。而后咱们定义了一个代理类 Proxy,并在 request() 办法中进行提早加载。当客户端第一次调用 request() 办法时,代理会创立一个实在主题对象并进行初始化操作。当客户端再次调用 request() 办法时,代理会间接调用实在主题的办法。

总结

代理模式是一种罕用的设计模式,它为其余对象提供了一个代理,以管制对这个对象的拜访。代理模式能够用来限度拜访、实现近程拜访、提早加载等性能。在本文中,咱们介绍了代理模式的根本构造和原理,并通过三个例子来阐明代理模式的利用。心愿读者可能对代理模式有更深刻的理解。