代理模式

来源:互联网 发布:知豆电动汽车官方网站 编辑:程序博客网 时间:2024/06/05 14:18

代理模式


介绍

在一些情况下,客户端不想或者不能够直接引用一个对象,而代理对象就可以在客户端和目标对象之间起到中介的作用。
代理设计模式:可以先简单理解为代理商或中介的概念,比如上网我们可能就会使用代理服务器去上网。

**典型的代理设计模式:**proxy对象不是真正的服务提供者,它只是负责中间一些验证监控或日志之类的操作。

备注:代理模式分为两种静态代理和动态代理


代理模式涉及的角色

抽象主题角色:声明了真实主题和代理主题的共同接口
代理主题(Proxy):代理主题角色内部含有对真实主题的引用,从而在任何时候可以操作真实主题对象
真实主题:定义了代理角色所代表的真实对象

静态代理

Subject(主题接口)

/** * Subject主题接口(有一个上网方法) * @author xuyi */public interface Subject {    //定义上网功能    void surfTheInternet();}

RealSurfInternetSubject(真实主题实现类)

/** * 真实主题实现类(里面有一个具体的上网方法功能) * 同时又不希望这个方法对客户端直接暴露, * 所以借助代理对象来隔离与客户端的直接交互。 * @author xuyi * */public class RealSurfInternetSubject implements Subject {    @Override    public void surfTheInternet() {        System.out.println("surf the internet ...");    }}

ProxySurfInternetSubject(代理主题对象)

/** * 代理主题上网对象 *  * @author xuyi */public class ProxySurfInternetSubject implements Subject {    private Subject subject;    @Override    public void surfTheInternet() {        beforeSurf();// 上网之前的身份认证        if (subject == null) {            subject = new RealSurfInternetSubject();            subject.surfTheInternet();// 实际上网操作        }        afterSurf();// 上网之后的监控操作    }    private void beforeSurf() {        System.out.println("before surf 上网前操作");        // 比如上网前要进行上网者的身份验证等认证信息    }    private void afterSurf() {        System.out.println("after surf 上网后操作");        // 比如监控上网流量之类其它监控操作    }}

MainAPP

public class MainApp {public static void main(String[] args) {        //初始化代理对象        ProxySurfInternetSubject proxySurfInternetSubject = new ProxySurfInternetSubject();        //通过代理对象的surfTheInternet()方法享受上网功能        proxySurfInternetSubject.surfTheInternet();    }}

动态代理

UserService接口

public interface UserService {    void addUser(String username);}

UserServiceImpl实现类

public class UserServiceImpl implements UserService {    @Override    public void addUser(String username) {        System.out.println("addUser info --->" + username);    }}

PersonService接口

public interface PersonService {    void addPerson(String name, int age);}

PersonServiceImpl实现类

public class PersonServiceImpl implements PersonService {    @Override    public void addPerson(String name, int age) {        System.out.println("addPerson info --->name:" + name + "  age:" + age);    }}

ObjectProxy万能代理对象(最核心)

/** * 万能代理对象(看我取名字就能看出来了ObjectProxy) *  * @author xuyi * */public class ObjectProxy implements InvocationHandler {    private Object target;    /**     * 通过构造方法传入需要使用的主题实现类对象     *      * @param target     */    public ObjectProxy(Object target) {        this.target = target;    }    /**     * 使用Proxy创建代理对象实例<br>     * 核心方法     *      * @return     */    public Object createProxy() {        return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);    }    @Override    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {        // TODO Auto-generated method stub        beforeInvoke();        System.out.println(method.getName());// 输出执行方法名        printArgs(args);// 输出执行方法传入参数        Object result = method.invoke(target, args);        afterInvoke();        return result;    }    private void beforeInvoke() {        System.out.println("前置操作...");    }    private void afterInvoke() {        System.out.println("后置操作...");    }    private void printArgs(Object[] args) {        if (args != null && args.length > 0) {            for (Object arg : args) {                System.out.println(arg);            }        } else {            System.out.println("无传入参数");        }    }}

总结

动态代理是Spring AOP声明式事务实现的基础

0 0
原创粉丝点击