静态代理:
- 抽象角色 : 一般使用接口或者抽象类来实现,真实角色和代理角色共有的特征
- 真实角色 : 被代理的角色
- 代理角色 : 代理真实角色 ; 代理真实角色后 , 一般会做一些附属的操作 ,不改变被代理对象方法前提下,增强被代理角色的方法。
- 客户 : 使用代理角色来进行一些操作 .
例如:歌手只负责唱歌,他的经纪人要帮助歌手在唱歌基础前后打理,如售票协商,签合同,收益计算等等。
Singer接口:
public interface Singer {
void sing();
}
具体的singer对象:
public class MaleSinger implements Singer{
@Override
public void sing() {
System.out.println("周杰棍的双节伦在唱歌");
}
}
★ singer的代理对象(经纪人):
public class Agency implements Singer{
private Singer singer;
public Agency(Singer singer) {
this.singer = singer;
}
@Override
public void sing() {
System.out.println("本代理负责会前售票协商");
//一定是歌手(被代理对象)唱歌
singer.sing();
System.out.println("本代理负责会后收益安排");
}
}
观众client:
public class Client {
public static void main(String[] args) {
Singer singer = new MaleSinger();
Agency agency = new Agency(singer);
agency.sing();
}
}
动态代理:
别把它想的多复杂,静态代理是手写代理对象,而动态代理是可以让代码生成代理对象。
当有大量的类需要执行一些共同代码时,我们自己写太麻烦,那直接使用java代码,自动生成一个类帮助我们批量的增强某些方法。
1.jdk自带的基于接口的动态代理:
Singer接口:
public interface Singer {
void sing();
void say();
}
具体singer类:
public class MaleSinger implements Singer{
@Override
public void sing() {
System.out.println("周杰棍的双节伦在唱歌");
}
@Override
public void say() {
System.out.println("周#杰棍♂的双★节伦说¥唱");
}
}
★代理类:
public class Agency implements InvocationHandler {
private Object object;
public Agency(Object object) {
this.object = object;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("演唱会前合同协商会场安排");
Object invoke = method.invoke(object, args);
System.out.println("结算");
return invoke;
}
}
★Client类:
public class Client {
public static void main(String[] args) {
MaleSinger maleSinger = new MaleSinger();
Singer singer= (Singer) Proxy.newProxyInstance(Client.class.getClassLoader(),
new Class[]{Singer.class},
new Agency(maleSinger));
singer.say();
singer.sing();
}
}
核心:一个动态代理 , 一般代理某一类业务 , 一个动态代理可以代理多个类,代理的是接口!
本文深入探讨了Java中的静态代理和动态代理概念。通过歌手与经纪人的例子展示了静态代理的工作原理,以及如何通过JDK的动态代理实现代理类的自动生成。同时,提到了基于CGLIB的动态代理,用于没有实现接口的类的代理。文章强调了动态代理在处理大量类的共同逻辑时的优势,并提供了相关代码示例。
324

被折叠的 条评论
为什么被折叠?



