代理模式

什么是代理模式

代理(Proxy)是一种设计模式,通过代理对象访问目标对象。这样做的好处是可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。举个例子来说明代理的作用,假设我们想邀请一位明星,那么并不是直接连接明星,而是联系明星的经纪人,来达到同样的目的。明星就是一个目标对象,他只要负责活动中的节目,而其他琐碎的事情就交给他的代理人(经纪人)来解决,这就是代理思想在现实中的一个例子。

用图表示如下

在Spring中的AOP就是一种典型的代理模式,我们可以使用代理模式实现那些事情?

1.打印方法日志

2.开启关闭回滚事物

3.权限或者安全校验

。。。

 

1. 静态代理

静态代理在使用时,需要定义接口,被代理对象与代理对象一起实现相同的接口。下面给大家演示一个打印进入方法和执行完方法的日志功能。

StudentOperator.java  

// 学生操作类接口
public interface StudentOperator{
void add();
}

StudentOperatorImpl.java


// 学生操作实现类(被代理对象)
public
class StudentOperatorImpl implements StudentOperator {

    @Override
    public void add() {
        System.out.println("添加学生信息");
    }
}

StudentProxy.java

// 代理对象
public
class StudentProxy implements StudentOperator{ private StudentOperator studentOperator; public StudentProxy(StudentOperator studentOperator){ this.studentOperator = studentOperator; } @Override public void add() { // TODO:打印开始方法日志 try { studentOperator.add(); }catch(Exception e){ // TODO:方法报错了 } // TODO:打印结束方法日志 } }

Main方法

public class Main {
    public static void main(String[] args) {
        StudentOperator oper = new StudentProxy(new StudentOperatorImpi());
        oper.add();
    }
}

静态代理总结:
1.优点:可以做到在不修改目标对象的功能前提下,对目标功能扩展。
2.缺点:因为代理对象需要与目标对象实现一样的接口,所以我们需要有很多代理类。

 

2.  动态代理

动态代理的特点

1. 代理对象,不需要实现接口。
2. 代理对象的生成,是利用JDK的API,动态的在内存中构建代理对象(需要我们指定创建代理对象/目标对象实现的接口的类型)。
3. 动态代理也叫做JDK代理,接口代理。

ProxyFactory.java

// 动态代理工厂类
public
class ProxyFactory { private Object object; public Object newProxyInstance(Object object) { this.object = object; return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object object, Method method, Object[] args) throws Throwable { System.out.println("开始事务"); //执行目标对象方法 Object returnValue = method.invoke(target, args); System.out.println("提交事务"); return returnValue; } }); } }

Main.java

public class Main {
    public static void main(String[] args) {
        SutdentOperator oper = (StudentOperator) new ProxyFactory().newProxyInstance(new StudentOperatorImpl());
        oper.add();
    }
}


总结:代理对象不需要实现接口,但是目标对象一定要实现接口,否则不能用动态代理。

posted on 2019-03-18 00:53  李双龙  阅读(274)  评论(0)    收藏  举报

导航