代理模式

代理模式

定义:为某个对象提供一个代理,以控制对这个对象的访问。代理类和委托类有共同的父类或父接口,这样在任何使用委托类对象的地方都可以用代理对象替代。代理类负责请求的预处理、过滤、将请求分派给委托类处理、以及委托类执行完请求后的后续处理。

 

代理模式UML类图:


解释说明:代理类Proxy,和实际主题RealSubject都实现了抽象主题Subject的接口,且Proxy中包含RealSubject的引用,这样代理的实例就可以控制对它所包含的RealSubject角色实例的访问,即可以控制它所代理的对象的访问,从而达到代理目的。

静态代理模式案例

说明:静态代理是由程序员创建或者工具生成代理类的源码,再编译代理类所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。

代码:

packageorg.sdibt.freebird.pattern;

/**

 * 被代理者

 * @author 15684

 */

publicclass RealStudent implements ISign{

 

    @Override

    publicvoid sign() {

        // TODO Auto-generated method stub

        System.out.println("--------本人跟学校签订就业协议--------");

    }

}

 

 

packageorg.sdibt.freebird.pattern;

/**

 * 代理者

 * @author 15684

 */

publicclass ProxyStudent implements ISign{

    privateRealStudent real;

    publicRealStudent getReal() {

        returnreal;

    }

    publicvoid setReal(RealStudent real) {

        this.real = real;

    }

    @Override

    publicvoid sign() {

        // TODO Auto-generated method stub

        System.out.println("-------代理前请出示身份证--------");

        this.getReal().sign();

    }

}

 

packageorg.sdibt.freebird.pattern;

/**

 * 接口

 * @author 15684

 */

publicinterface ISign {

 

    voidsign();

}

 

packageorg.sdibt.freebird.pattern;

/**

 * 测试代理类

 * @author 15684

 */

publicclass TestProxy {

 

    publicstaticvoid main(String[] args) {

        RealStudent real = new RealStudent();

        ProxyStudent proxy = new ProxyStudent();

        proxy.setReal(real);

        proxy.sign();

    }

}

 

动态代理模式案例

/**

 * 接口

 * @author15684

 */

publicinterface ISign {

    void sign();

}

/**

 * 定义切面

 * @author15684

 */

publicclass MyAspectHandler implements InvocationHandler{

    private Object target;

    public Object getTarget() {

        returntarget;

    }

    publicvoid setTarget(Object target) {

        this.target = target;

    }

    @Override

    public Object invoke(Object proxy, Method method, Object[] args)

           throws Throwable {

        // 定义切面

        System.out.println("----代理前请出示身份证。。。。。");

         Object invoke = method.invoke(target);

        System.out.println("------代理完成后电话告知------");

        returninvoke;

    }

}

 

/**

 * 被代理者

 * @author15684

 */

publicclass RealStudent implements ISign{

 

    @Override

    publicvoid sign() {

        // TODO Auto-generated method stub

        System.out.println("--------本人跟学校签订就业协议--------");

    }

}

 

/**

 * 测试动态代理

 * @author15684

 */

publicclass TestDynamicProxy {

 

    publicstaticvoid main(String[] args) {

        MyAspectHandler myAspectHander = new MyAspectHandler();

        myAspectHander.setTarget(new RealStudent());

        ISign proxy = (ISign) Proxy.newProxyInstance(RealStudent.class.getClassLoader(), new Class[] {ISign.class}, myAspectHander);

        proxy.sign();

    }

}

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值