您的位置:首页 > 其它

设计模式系列之六:代理模式

2017-02-22 10:12 225 查看
代理模式是一种很常用的结构型模式,类似于生活中的代理机构,比如机票代购点,海外代购等等,演员的经纪人就是所谓的代理人也是这种形式。

代理模式分为静态代理和动态代理

静态代理有三个核心角色,抽象角色(定义真实角色和代理角色对外的公开方法),真实角色(实现抽象角色的方法以供道理角色调用,关注真正的业务逻辑),代理角色(实现抽象角色,是真实角色的代理,通过真实角色的方式实现抽象角色的方法并可以添加自己的操作,统一处理流程控制)

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();
}
}

处理结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: