在不改变原功能的情况下,在代理对象中进行增强。
假设有一个场景,明星是一个群体,所有的明星都会唱、篮球、rap。
那么你想当一个明星,你就要会唱歌、打篮球、rap。
这时,观众想看某个明星表演。但是观众无法直接找到明星让他表演,需要通过明星的经纪人,跟经纪人谈好后才会让明星进行表演。
经纪人也需要做出一些准备,才可以让明星进行表演。
在这个场景中,明星群体就是一个接口,定义了唱、篮球、rap三个抽象方法。而明星就是明星群体接口的子类,需要实现所有方法。经纪人就是明星群体的代理对象。
接下来看代码:
明星群体(接口):
public interface Star {
public String sing(String name);
public void basketball();
public String rap();
}
明星个人(实现子类):
public class StarPerson implements Star{
private String name;
public StarPerson(String name) {
this.name = name;
}
@Override
public String sing(String name) {
System.out.println(this.name + "正在唱:" + name);
return "鸡鸡鸡鸡鸡鸡鸡你太美~";
}
@Override
public void basketball() {
System.out.println(this.name + "打篮球很帅!");
}
@Override
public String rap() {
System.out.println(this.name + "的rap好听吗!!");
return "只因你太美~";
}
}
经纪人(代理对象):
public static Star createProxy(StarPerson starPerson){
/**
* 创建代理对象
* ClassLoader loader, 类加载器
* Class<?>[] interfaces, 接口的字节码对象,指定的代理长什么样,有哪些方法
* InvocationHandler h 指定生成的代理对象要做什么事情
*/
Star starProxy = (Star) Proxy.newProxyInstance(
ProxyUtil.class.getClassLoader(),
new Class[]{Star.class},
new InvocationHandler() {
/**
* 回调方法,代理对象执行方法会调用invoke方法
* @param proxy 当前的代理对象
* @param method 当前代理对象执行的方法
* @param args 执行方法的参数
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
String behavior = method.getName();
if (behavior.equals("sing")){
System.out.println("听我唱歌,备好纸巾。");
} else if (behavior.equals("basketball")){
System.out.println("看我打球,尖叫起来。");
} else if (behavior.equals("rap")){
System.out.println("要听rap,先买票。");
}
return method.invoke(starPerson,args);
}
}
);
return starProxy;
}
观众(调用方法):
public static void main(String[] args) {
Star starProxy = ProxyUtil.createProxy(new StarPerson("你鸡哥"));
String sing = starProxy.sing("征服");
System.out.println(sing);
starProxy.basketball();
String rap = starProxy.rap();
System.out.println(rap);
}
执行结果:
听我唱歌,备好纸巾。
你鸡哥正在唱:征服
鸡鸡鸡鸡鸡鸡鸡你太美~
看我打球,尖叫起来。
你鸡哥打篮球很帅!
要听rap,先买票。
你鸡哥的rap好听吗!!
只因你太美~
执行流程:
以上内容纯属娱乐,如有不严谨的地方,欢迎各位大佬留言私信进行指正,还请各位大佬不吝赐教。谢谢!