开始系统的学习Java已经一个月了,最近学习了代理这种设计模式,因为前面学的不太扎实被一段样例代码卡了一会儿,看来学习Java还得学扎实,不然会严重影响后面的学习进度。

首先说一下什么是代理模式?

代理模式的定义:代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。举例说明,就是一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之前起到中介的作用。

现实应用举例

生活中使用到的代理上网,客户通过网络代理连接网络,由代理服务器完成用户权限,访问限制等与上网操作相关的操作。

<figcaption> 代理上网示意图 </figcaption>

不管是代理操作也好,真实的操作也好,其共同的目的就是一个上网,所以用户关心的只是如何上网,至于里面是如何操作的用户并不关心。那么我们在下面就以此为例进行代码讲解

(1)定义一个上网的接口

interface Network{                    // 定义Network接口
	public void browse() ;                // 定义浏览的抽象方法
}

(2)声明一个真实上网的类,继承上网接口

class Real implements Network{            // 真实的上网操作
	public void browse(){                // 覆写抽象方法
		System.out.println("上网浏览信息") ;
	}
}

(3)声明一个代理上网的类,继承上网接口

class Proxy implements Network{            // 代理上网
	private Network network ;
	public Proxy(Network network){  //构造函数通过传入通过真实上网类实例化的对象进行设置代理的真实操作
		this.network = network ;            // 设置代理的子类
	}
	public void check(){                // 与具体上网相关的操作
		System.out.println("检查用户是否合法");
	}
	public void browse(){       //覆写抽样方法
		this.check() ;                // 可以同时调用多个与具体业务相关的操作
		this.network.browse() ;  //表示当前调用的真实上网对象的browse方法,这里不明白的可以看我关于this关键字的文章
	}
}

(4)声明一个客户端的类,进行测试

public class ProxyDemo{
	public static void main(String args[]){
                Real r = new Real(); //实例化一个Real类对象,用来将真实操作传入代理
		Network net = new Proxy(r); //通过Proxy子类实例化接口
		net.browse();  //当前net是通过Proxy子类实例化的对象,所以这里调用的是Proxy类中的browse方法
	}
}

程序运行结果:
检查用户是否合法
上网浏览信息

 代理操作流程

 通过代理实现权限控制

通过上面的例子,我们可能会有这样的疑问,为什么干脆不直接上网,干嘛非得要通过一种代理的模式去上网的。当然可以,如果在使用场景中实现类能满足要求时,我们当然可以直接实现类,但当实现类不能满足要求,要扩展需求,根据开闭原则你又不能修改实现类代码,这时你就用代理类。比如现在不想让你去浏览一些网站,就可以通过代理机制来进行一个筛选过程,将一些网站过滤掉,然后再反馈给你想让你浏览的网站,来实现一个权限控制。(当然,我们可以通过课|学|尚|往来解决这个问题,以后有时间写一篇关于这个的详细教程( ̄y▽, ̄)╭ )