java 代理模式

代理模式:为其他对象提供一种代理以控制这个对象的访问,在某些情况下,一个对象不适合或者不能直接引用这个对象,

而代理对象可以在客户端和目标对象之间起到中介作用.

代理模式有二种,一种是静态代理,一种是动态代理,代理在我们生活中很常见,比如我们很讨厌在朋友圈里的那些微商,微商不会真正生产产品拿出来销售的,而他们的产品来自工厂,微商只是个代理而已,代理工厂销售产品,还有比如你在外地上班,家里有人给你介绍对象,但是你又在外地一时回不来,那么你父母肯定会先帮你去把把关,看看咋样,你父母其实起的就是代理角色,现在写个demo来玩下静态代理,以小明相亲为例


public interface People {
void xiangqin();
}

小明

public class XiaoMing implements People {
@Override
public void xiangqin() {
System.out.println("我想找一个身材和范冰冰一样好的女孩做老婆");
System.out.println("由于工作很忙,让我爸爸先去帮我把把关吧");
}
}

小明爸爸:

/**
 * 代理角色,代理他儿子
 */
public class XiaoMingFather implements People{
private XiaoMing xiaoMing;
public XiaoMingFather(XiaoMing xiaoMing) {
super();
this.xiaoMing = xiaoMing;
}
@Override
public void xiangqin() {
System.out.println("我要一个孝顺的女孩作为我儿媳妇");
xiaoMing.xiangqin();
}
}

调用:

public class Test {
public static void main(String[] args) {
XiaoMing xiaoming = new XiaoMing();
XiaoMingFather father = new XiaoMingFather(xiaoming);
father.xiangqin();
}
}


上面就是一个简单的静态代理.小明是被代理的角色,小明父亲是代理角色,我们可以看出来代理角色是可以增强功能的,在小明父亲的xiangqin()方法中就打印出来了一句话,这就是功能增强,XiaoMing和XiaoMingFather这二个类都实现了People接口,这个接口是规范了代理和被代理的行为,你不可能让一条狗去代理小明相亲吧,这个接口肯定是代理和被代理角色都有的行为,不然不成了人狗情未了,XiaoMing可以称之为实现类,表示具体的某个个体,代理类是代理实现类,可以分为如下几个:

接口:规范代理和实现类的行为

实现类:表示具体的个体 真正被代理的对象

代理类:代理实现类


静态代理:可以做到在不修改实现类对象的功能前提下,对目标功能扩展(代理类进行扩展),如果代理类太多的话,会造成项目中类太多,就不好维护了,如果接口规范发生了改变,那么实现类和代理类都要做出改变.比如增加了一个接口,那么实现类和代理类都要去重新修改代码,然后加上响应的逻辑,就会导致不好维护.


有静态代理,就有动态代理,而且大部分情况下都是用动态代理,二者的区别在哪呢?一是静态代理走接口,动态代理走普通类,二是动态代理类是动态生成的,且可以代理多个

动态代理jdk其实已经帮我实现好了,看demo


public class proxyHandler implements InvocationHandler{
//真正被代理的对象
private Object obj;
public proxyHandler(Object obj) {
super();
this.obj = obj;
}
/**
* proxy:代理对象
* method 被代理的方法
* args:被代理方法传入的参数
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//扩展逻辑功能
before();
Object target = method.invoke(obj, args);
return target;
}
private void before() {
System.out.println("老爸帮我去看看这女孩怎么样");
}
}

这个类就相等于静态代理中的增强逻辑功能和执行被代理类对象,


public class DynamicProxyDemo {
public static void main(String[] args) {
/**
* laoder 类加载器
* interfaces 代理类型的数组
* h 代理类回调执行类
*/
People people = (People) Proxy.newProxyInstance(People.class.getClassLoader(), new Class[]{People.class},new proxyHandler(new XiaoMing()));
people.xiangqin(5);
}
}


上面的Proxy.newProxyInstance()这个是动态生成代理类对象,这就可以看的出来,我们现在就没有XiaoMingFather这个类也就是代理角色了,而是动态的去生成代理对象了,但是实现类和规范都是和以前一样,所以为什么叫动态代理了,如果是实现类非接口中的方法是调不到的,加入我们在People接口中添加其他方法的话,只要在XiaoMing这个类去实现就行,如果要实现多个代理对象也比静态代理简单的多.




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值