- 为什么需要代理?对象如果嫌自己的事太多了,可以通过代理来转移部分职责。
- 代理长什么样?对象有什么方法想被代理,代理就一定要有对应的方法。但是方法做的事不同,代理是去调对象的方法。
- 中介如何知道要派唱歌、跳舞方法的代理?通过继承接口

实现:
interface Star { String sing(String name); void dance(); }
@Data @AllArgsConstructor class BigStart implements Star { String name;
@Override public String sing(String name) { System.out.println(this.name + "唱歌:" + name); return "唱完了,谢谢"; }
@Override public void dance() { System.out.println(this.name + "跳舞"); } }
class ProxyUtil { public static Star createProxy(BigStart bigStart) {
Star starProxy = (Star) Proxy.newProxyInstance(ProxyUtil.class.getClassLoader(), new Class[]{Star.class}, new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if (method.getName().equals("sing")) { System.out.println("准备话筒,收钱"); } else if (method.getName().equals("dance")) { System.out.println("准备场地,收钱"); } return method.invoke(bigStart, args); } }); return starProxy; } }
public class MyTest { public static void main(String[] args) { BigStart bigStart = new BigStart("杨超越"); Star proxy = ProxyUtil.createProxy(bigStart);
String res = proxy.sing("好日子"); System.out.println(res);
proxy.dance(); } }
|
代理模式的主要目的是在客户端和目标对象之间添加一个中间层,以便在访问目标对象时执行额外的操作。
在方法执行前后记录日志信息,记录方法的执行时间、参数、返回值等。