代理模式
前言
我们平常买票,可能到过年高峰期会出现买不到票的情况,这个时候我们可能就会委托黄牛,或者携程这些第三方的帮我们进行抢票。
又可以说比如我们的代理服务器,我客户端通过代理服务器和我们真正的服务器进行交流,如爬虫服务器。
又可以说我们买房子,租房子,我们提要求给中介,由中介替我们去找寻房子。
又可以说我们要去见某个领导处理某件事情,可能我们需要先联系它的助理,然后由助理代我们去转达。
这些等待都是我们平常生活中的一种代理机制。我们不直接去联系源头,而是由我们的代理去操作。
-
用处
- 对源码的拓展
- 权限机制管理
当然这里还有其他许多用处,这里就说些我日常用的比较多的。
-
分类
- 静态代理
- 动态代理
-
源码拓展(静态代理实现)
现在我们做个假设,比如我们源码中有一个buyinter对象,我们不能去对他进行更改,但我们想要对他进行拓展,我们分为 用户实现类 代理类 源头类 三类。 -
源头类(保证实现了与代理类的同源性)
public interface buyInter {
//买票
public abstract void buyticket();
}
- 代理类 (这里就对我们的源头类进行了拓展,增加了一个金额的设置以及判断操作)
public class buyproxy implements buyInter{
private int money=0;
public void setMoney(int money){
this.money=money;
}
@Override
public void buyticket() {
if (money<=0){
System.out.println("请告诉我们你需要购买的票价哦!");
return;
}
System.out.println("你好,这里是黄牛集团,正在为买票!");
}
}
- 实现类
public class buyobject implements buyInter {
buyproxy buyproxy;
public buyobject(buyproxy buyproxy){
this.buyproxy=buyproxy;
}
@Override
public void buyticket() {
System.out.println("我要买一张去北京的机票");
System.out.println("100元的那种");
buyproxy.setMoney(100);
buyproxy.buyticket();
}
}
运行结果
buyproxy buyproxy=new buyproxy();
buyobject buyobject=new buyobject(buyproxy);
buyobject.buyticket();
我要买一张去北京的机票
100元的那种
你好,这里是黄牛集团,正在为买票!
那么至此我们的一个静态代理实现就结束了,这里如果不明白源头类的用处在哪里我再来说明一次,源头类是为了保证我们实现类和代理类的同源性,实现相同方法,相同功能,这里我们的实现类就相当于我们自己,代理类就是我们的中介,由我们的代理类去找房子,注意这里源头类不是房子,它只是为了保持我们的实现类以及代理类的同源性。
再比如我们现在要操作数据库,但是普通用户只能读,而管理员才能删除,我们实现类就是用户,不用管什么权限,只管去操作就好,而我们的代理类负责我们的权限判断,如果我们是普通用户,它则帮助我们去进行读,如果我们是管理员它则帮助我们去删除。
尾言
什么时候我们应该使用静态代理,什么时候应该使用动态代理?
静态代理当我们的代理类较少的时候可以使用,较多我们应该是用动态代理。
静态代理的缺点,源头一改,我们的实现类以及代理类都要变动。