代理设计模式(歌手+经纪人)
1. 通用Code
public interface Work {
void confer();
void signContract();
void sing();
void collectMoney();
}
public class Singer implements Work {
@Override
public void confer() {
System.out.println("Singer.confer: 歌手商议");
}
public void signContract() {
System.out.println("Singer.signContract: 歌手签合同");
}
@Override
public void sing() {
System.out.println("Singer.sing: 歌手唱歌");
}
@Override
public void collectMoney() {
System.out.println("Singer.collectMoney: 歌手收钱");
}
}
2. 静态代理
2.0 UML结构图
![静态代理UML结构图](https://i-blog.csdnimg.cn/blog_migrate/147c90f82df594961da4f0f5e6e8fee2.png)
2.1 Code
import com.skey.designpattern.proxy.Work;
public class Agent implements Work {
private Work work;
public Agent(Work work) {
this.work = work;
}
@Override
public void confer() {
System.out.println("Agent.confer: 经纪人商议");
}
@Override
public void signContract() {
System.out.println("Agent.signContract: 经纪人签合同");
}
@Override
public void sing() {
work.sing();
}
@Override
public void collectMoney() {
System.out.println("Agent.collectMoney: 经纪人收钱");
}
}
2.2 Test
import com.skey.designpattern.proxy.staticproxy.Agent;
public class StaticProxyTest {
public static void main(String[] args) {
Singer singer = new Singer();
Work work = new Agent(singer);
work.confer();
work.signContract();
work.sing();
work.collectMoney();
}
}
3. 动态代理(JDK自带动态代理)
3.0 UML结构图
![动态代理UML结构图](https://i-blog.csdnimg.cn/blog_migrate/2219ddb82d02d00aa2fae9a5fe48f95e.png)
3.1 Code
public class WorkHandler implements InvocationHandler {
private Work work;
public WorkHandler(Work work) {
this.work = work;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object obj = null;
if ("sing".equals(method.getName())) {
System.out.println("WorkHandler.invoke: 代理商议");
System.out.println("WorkHandler.invoke: 代理签合同");
obj = method.invoke(work, args);
System.out.println("WorkHandler.invoke: 代理收钱");
}
return obj;
}
}
3.2 Test
import com.skey.designpattern.proxy.dynamicproxy.WorkHandler;
import java.lang.reflect.Proxy;
public class DynamicProxyTest {
public static void main(String[] args) {
Singer singer = new Singer();
WorkHandler handler = new WorkHandler(singer);
Work proxy = (Work) Proxy.newProxyInstance(
ClassLoader.getSystemClassLoader(),
new Class[]{Work.class},
handler);
proxy.sing();
}
}
4. 动态代理(字节码操作)
4.1 javaassist (暂无示例)
4.2 cglib + ASM
public class DynamicProxyCglibTest {
public static void main(String[] args) {
Singer singer = new Singer();
Singer proxySinger = (Singer) Enhancer.create(Singer.class, new MethodInterceptor() {
@Override
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
Object obj = null;
if ("sing".equals(method.getName())) {
System.out.println("Enhancer.invoke: 代理商议");
System.out.println("Enhancer.invoke: 代理签合同");
obj = method.invoke(singer, args);
System.out.println("Enhancer.invoke: 代理收钱");
}
return obj;
}
});
proxySinger.sing();
}
}