动态代理
原类
//对象事情太多,且耦合性高 当需要对唱歌类增加氛围组(新需求或功能)时,需要在源码修改
class 明星A(){
唱歌(){
//准备演唱会
//唱歌
}
}
代理
被代理类
//为什么明星也要实现这个接口-->当明星要更改需求,接口方法要改变,代理方法随着接口改变而改变 (java生产代理的约定)
class 明星() implements 需求{
private String name; // 暂且为明星A
public BigStar(String name) {
this.name = name;
}
public String sing(String singname){//先写为成员方法理解,后面继承接口之后 ALT+回车 (实际为需求接口的实现)
System.out.println(this.name+"正在唱"+singname); //只需要写自己要做的事情
return "谢谢";
}
}
中介
产生代理的工具类
//明星A找什么样的经纪人-->需要告诉中介公司 然后中介公司 找到合适的经纪人-->找会唱歌,跳舞的--> 接口(明星给中介的需求)
class 中介(){ //产生代理的工具类
public static "需求" createProxy(明星 明星A){//返回类型为 需求类 (返回含有这个需求的代理)
//newProxyInstance()返回类型为 Object-->强转
Star starproxy=(Star)proxy.newProxyInstance(类加载器,.new Class[]{ 接口.Class },new InvocationHandler(){
//本方法相当于经纪人要做的事情
@Override // Method->经纪人需要做的事情 arg->告诉明星需要唱什么歌 (被代理类方法传入的参数)
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//判断经纪人需要做的事情 (判断为传入的方法,书写代理的代码)
if(method.getName().equals("sing")){
准备演唱会,收钱 //代理的事情
}
return method.invoke(明星A,args); //告诉明星需要做的事情 (运行被代理类)
});
}
}
需求
interface 需求(){
唱歌(String singname);
}
实现结果
public class Main {
public static void main(String[] args) {
BigStar bigStar=new BigStar("明星A");
Star star=ProxyUtil.createProxy(bigStar);
String sing = star.sing("月亮之上");
System.out.println(sing);
}
}