代理模式分为静态代理和动态代理,本篇文章谈谈我对于静态代理的理解。
还是先上代码
//一个名为网络的接口
interface NetWork{
public void browser();
}
//被代理类,网络服务
class Server implements NetWork{
@Override
public void browser() {
System.out.println("被代理类");
}
}
//代理类
class ProxyServer implements NetWork{
private NetWork netWork;
//代理类的构造器
public ProxyServer(NetWork netWork){
this.netWork = netWork;
}
public void check(){
System.out.println("检查网络");
}
@Override
public void browser() {
check();
netWork.browser();//代理类调用被代理类的方法
}
}
//主函数
public static void main(String[] args) {
//通过Server新生成了一个对象server,server是被代理类的对象
Server server = new Server();
/*通过ProxyServer新生成了一个对象proxyServer ,
然后将sever赋值给了proxyServer */
ProxyServer proxyServer = new ProxyServer(server);
//通过proxyServer 调用browser()方法
proxyServer.browser();
}
运行结果:
代理类和被代理类要实现接口,所以两个类中都要覆盖接口中的browser()方法。
我们来梳理一下代码的运行过程,
调用的browser方法是属于代理类中的browser方法,但是由于代理类中的browser方法又调用了被代理类中的browser方法,所以被代理类的browser方法得以被调用。
而做到让被代理方法可以调用代理方法中的browser方法的是接口NetWork,代理类的构造器是有参的,它的参数就是NetWork类型的变量,我们是通过NetWork类型的变量调用了被代理类的browser方法。
ProxyServer proxyServer = new ProxyServer(server);
/*这行代码就是多态性的体现,
声明的是ProxyServer 类型,
但是引用却是Server类型的*/
如果熟悉多态的知识,那么这个方法的调用过程理解起来就容易多了。
代理模式就是为了扩展功能,同时还保有被代理类的功能。