代理模式笔记

一.什么是代理模式及其作用

    Proxy Pattern(即:代理模式),23种常用的面向对象软件的设计模式之一

代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
优点:
(1).职责清晰
真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。
(2).代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了的作用和保护了目标对象的作用。
(3).高扩展性
结构
一个是真正的你要访问的对象(目标类),另一个是代理对象,真正对象与代理
对象实现同一个接口,先访问代理类再访问真正要访问的对象。

接口

public interface KindWomen {
    public void ThrowEye(double Money);
    public void doSomething(double Money);
}

需要访问的实现类

public class PJL implements KindWomen{
    @Override
    public void ThrowEye(double Money) {
        System.out.println("拿了"+Money+",pjl抛媚眼");
    }

    @Override
    public void doSomething(double Money) {
        System.out.println("拿了"+Money+",pjl。。。");
    }
}

代理类

public class WP implements KindWomen{
    KindWomen pjl;

    public WP(KindWomen pjl) {
        this.pjl = pjl;
    }

    @Override
    public void ThrowEye(double Money) {
        pjl.ThrowEye(Money);
    }

    @Override
    public void doSomething(double Money) {
        pjl.doSomething(Money);
    }
}

访问类

public class XMQ {
    public static void main(String[] args) {
        PJL pjl=new PJL();
        WP wp=new WP(pjl);
        wp.ThrowEye(10);
        wp.doSomething(10);
    }
}

二.动态代理

动态代理它可以直接给某一个目标对象生成一个代理对象,而不需要代理类存在。
动态代理与代理模式原理是一样的,只是它没有具体的代理类,直接通过反射生成了一个代理对象。
动态代理生成技术:
1.jdk提供一个Proxy类可以直接给实现接口类的对象直接生成代理对象。
2.cglib (spring学习)

Java.lang.reflect.Proxy类可以直接生成一个代理对象

接口和需要访问的实现类与前面一样

访问类

public static void main(String[] args) {
        KindWomen kw=new PJL();
        //利用动态代理直接创建一个代理对象
        KindWomen proxy= (KindWomen) Proxy.newProxyInstance(kw.getClass().getClassLoader(),kw.getClass().getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                //方法前做的事
                System.out.println("执行方法前做的事");
                //方法执行
                Object o = method.invoke(kw,new Object[]{(double)args[0]/2});
                //方法后做的事
                System.out.println("方法后做的事");
                return o;
            }
        });
        proxy.ThrowEye(10);
        proxy.doSomething(5);
    }

附:AOP编程思想
利用前面的动态代理实现动态代理类时,可以在方法中前后添加方法,类似存在很多方法时要考虑到业务的问题,就可用这样的思想。

猜你喜欢

转载自blog.csdn.net/maniacxx/article/details/79110128