javawebday68_01(代理工厂简易版)

/**
 * 前置增强
 * @author Administrator
 *
 */
public interface BeforeAdvice {
    public void before();
}
/**
 * 后置增强
 * @author Administrator
 *
 */
public interface AfterAdvice {
    public void after();
}
//服务员
public interface Waiter {
    //服务
    public void serve();
    public void shouQian();
}
public class ManWaiter implements Waiter {

    public void serve() {
        System.out.println("服务中");
    }

    @Override
    public void shouQian() {
        System.out.println("给钱");

    }
}
/**
 * 用来生成代理对象
 * 需要所有的参数
 *  目标对象
 *  增强
 */
/**
 * 1、创建代理工厂
 * 2、给工厂设置三样东西
 *  目标对象:setTargetObject(xxx);
 *  前置增强:setBeforeAdvice(该接口的实现)
 *  后置增强: setAfterAdvice(该接口的实现)
 * 3、调用createProxy()得到代理对象
 *  执行代理对象方法时,
 *      执行BeforeAdvice的before()
 *      目标对象的目标方法
 *      执行AfterAdvice的after()
 * @author Administrator
 *
 */
public class ProxyFactory {
    private Object targetObject;//模版对象
    private BeforeAdvice beforeAdvice;//前置增强
    private AfterAdvice afterAdvice;//后置增强
    /**
     * 用来生成代理对象
     * @return
     */
    public Object createProxy(){
        /*
         * 1、给出三大参数
         */
        ClassLoader loader = this.getClass().getClassLoader();
        Class[] interfaces = targetObject.getClass().getInterfaces();
        InvocationHandler h = new InvocationHandler() {

            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                /*
                 * 在调用代理对象的方法时,会执行这里的内容
                 */
                //执行前置增强
                if(beforeAdvice!=null){
                    beforeAdvice.before();
                }
                Object result = method.invoke(targetObject, args);//执行目标对象的目标方法
                //执行后置增强
                if(afterAdvice!=null){
                    afterAdvice.after();
                }
                //返回目标对象的返回值
                return result;
            }
        };
        /*
         * 2、得到代理对象
         */
        Object proxyObject = Proxy.newProxyInstance(loader, interfaces, h);
        return proxyObject;
    }

    public Object getTargetObject() {
        return targetObject;
    }
    public void setTargetObject(Object targetObject) {
        this.targetObject = targetObject;
    }
    public BeforeAdvice getBeforeAdvice() {
        return beforeAdvice;
    }
    public void setBeforeAdvice(BeforeAdvice beforeAdvice) {
        this.beforeAdvice = beforeAdvice;
    }
    public AfterAdvice getAfterAdvice() {
        return afterAdvice;
    }
    public void setAfterAdvice(AfterAdvice afterAdvice) {
        this.afterAdvice = afterAdvice;
    }

}
/*
 * 目标是让目标对象和增强都可以切换
 */
public class Demo3 {
    @Test
    public void fun1(){
         ProxyFactory factory = new ProxyFactory();//创建工厂
         factory.setTargetObject(new ManWaiter());//设置目标对象
         factory.setBeforeAdvice(new BeforeAdvice() {//设置前置增强
            @Override
            public void before() {
                System.out.println("如果啊");
            }
        });
         factory.setAfterAdvice(new AfterAdvice() {//设置后置增强
            public void after() {
                System.out.println("告辞");
            }
        });
        Waiter waiter =  (Waiter) factory.createProxy();
        waiter.serve();
        waiter.shouQian();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值