1、程序为什么需要代理?代理有什么方法?
对象如果觉得身上干的事太多的话,可以通过代理来转移部分职责。
如明星和经纪人,明星只想做唱歌跳舞和演戏,不想被其他事情干扰,如拉赞助等,因此就请经纪人代理干这些事
对象有什么方法想被代理,代理就一定有对应的方法。
如明星有唱歌跳舞的方法,经纪人也应该有唱歌跳舞的方法,但是经纪人不是真的会唱歌跳舞,当程序需要用到明显的唱歌方法,此时会去调用经纪人的唱歌方法,在这个方法里面,经纪人会去准备话筒和收钱等操作,之后会去调明星的唱歌方法,让明星来唱歌
2、中介如何知道要派有唱歌、跳舞方法的代理呢?
解决方法:接口
// 明星接口
public interface Star {
String sing(String name);
void dance();
}
// 具体明星
public class SupperStar implements Star {
private String name;
public SupperStar(String name) {
this.name = name;
}
public String sing(String songName) {
System.out.println(this.name + "正在唱:" + name )
retuen "谢谢!"
}
public void dance() {
System.out.println(this.name + "正在跳舞" )
}
}
// 代理
import java.lang.reflect.Proxy;
public class ProxyUtil {
public static Star creatProxy (SupperStar ss) {
/**
* newProxyInstance(ClassLoader loader,
* Class<?>[] interfaces,
* InvocationHandler h)
* 参数1:指定类加载器;
* 参数2:指定生成的代理长什么样子,也就是有哪些方法
* 参数3:用来指定生成的代理对象要干什么事情
*/
//Star starProxy = ProxyUtil.creatProxy(s);
// starProxy.sing("好日子");starProxy.
Star starProxy = (Star) Proxy.newProxyInstance(ProxyUtil.class.gerClassLoader,
new Class[] {Star.class}, new InvocationHandler() {
@Override // 回调方法
public Object invoke(Object proxt,Methpd method, Object[] args) throws Throwable} {
// 代理对象做的事情
if (method.getName().equals("sing")) {
System.out.println("准备话筒,收钱20w");
} else if (method.getName().equals("dance")) {
System.out.println("准备场地,收钱1000w");
}
return method.invoke(ss,args);
} );
return starProxy;
}
}