乐趣区

关于代理模式:详解代理模式的基本结构和原理

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

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

根本构造

代理模式由三局部组成:形象主题(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() 办法时,代理会间接调用实在主题的办法。

总结

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

退出移动版