代理模式是一种很常用的结构型模式,类似于生活中的代理机构,比如机票代购点,海外代购等等,演员的经纪人就是所谓的代理人也是这种形式。
代理模式分为静态代理和动态代理
静态代理有三个核心角色,抽象角色(定义真实角色和代理角色对外的公开方法),真实角色(实现抽象角色的方法以供道理角色调用,关注真正的业务逻辑),代理角色(实现抽象角色,是真实角色的代理,通过真实角色的方式实现抽象角色的方法并可以添加自己的操作,统一处理流程控制)
package com.panda.staticProxy;
public interface Actor {
void faceTalk();
void signContract();
void perform();
void collectMoney();
}
package com.panda.staticProxy;
public class RealActor implements Actor{
@Override
public void faceTalk() {
// TODO Auto-generated method stub
System.out.println("演员老王面谈");
}
@Override
public void signContract() {
// TODO Auto-generated method stub
System.out.println("演员老王签协议");
}
@Override
public void perform() {
// TODO Auto-generated method stub
System.out.println("演员老王演出");
}
@Override
public void collectMoney() {
// TODO Auto-generated method stub
System.out.println("演员老王收尾款");
}
}
package com.panda.staticProxy;
public class Proxy implements Actor{
private Actor realActor;
public Proxy(Actor realActor) {
super();
this.realActor = realActor;
}
@Override
public void faceTalk() {
// TODO Auto-generated method stub
System.out.println("代理人老宋面谈");
}
@Override
public void signContract() {
// TODO Auto-generated method stub
System.out.println("代理人老宋签协议");
}
@Override
public void perform() {
realActor.perform();
}
@Override
public void collectMoney() {
// TODO Auto-generated method stub
System.out.println("代理人老宋收尾款");
}
}
现在
客户只需与代理人老宋接触,并洽谈有关事宜,老王只关注演戏
package com.panda.staticProxy;
public class Client {
public static void main(String[] args) {
Actor actor = new RealActor();
Proxy proxy = new Proxy(actor);
proxy.faceTalk();
proxy.signContract();
proxy.perform();
proxy.collectMoney();
}
}
结果:
动态代理:动态生成代理类。相比于静态代理,抽象角色中所有的方法都被调用到处理器一个集中方法中,这样我们可以更加统一和灵活的处理各种方法
package com.panda.dynamicProxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class StarHandler implements InvocationHandler{
Actor actor;
public StarHandler(Actor actor) {
super();
this.actor = actor;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("###在执行前###");
System.out.println("由老宋进行面谈");
System.out.println("由老宋进行签合同");
if(method.getName().equals("perform")){
method.invoke(actor, args);
}
System.out.println("###在执行后###");
System.out.println("由老宋进行收尾款");
return null;
}
}
调用时就不需要自定义一个代理类了
package com.panda.dynamicProxy;
import java.lang.reflect.Proxy;
public class Client {
public static void main(String[] args) {
Actor actor = new RealActor();
StarHandler handler = new StarHandler(actor);
Actor proxy = (Actor) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Actor.class}, handler);
proxy.perform();
}
}
处理结果: