静态代理和动态代理

来源:互联网 发布:编程语言pascal 编辑:程序博客网 时间:2024/05/30 23:02

静态代理和动态代理

介绍

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

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

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

静态代理

Net上网Subject

    /**     *      * @author xuyi3     * @2016年9月13日 @上午9:35:31     * @Net     上网类(上网Subject)     * @功能说明:<br>     * @春风十里不如你     * @备注     */    public class Net    {            /**             * 上网方法             */            public void internet()            {                System.out.println("internet ... ");            }    }

Net上网代理对象

/** *  * @author xuyi3 * @2016年9月13日 @上午9:31:17 * @NetProxy * @功能说明:<br> * @春风十里不如你 * @备注 */public class NetProxy{        //Net引用        private Net net;        public NetProxy()        {        }        /**         * <h3>上网方法</h3>         * @param username         * @param password         */        public void internet(String username, String password)        {            //首先进行身份验证            boolean verifySuccess = verifyIdentity(username, password);            if (verifySuccess)            {                if (net == null)                {                    net = new Net();                }                net.internet();            }            //上完网之后统计流量信息            countInternetTraffic();        }        /**         * <h3>验证上网者身份</h3>         * @param username      用户账号         * @param password      用户密码         * @return         */        private boolean verifyIdentity(String username, String password)        {            System.out.println("====身份验证====");            //验证上网者身份            return true;        }        /**         * <h3>统计上网信息</h3>         * @return         */        private int countInternetTraffic()        {            System.out.println("====统计流量====");            //计算上网流量            return 0;        }}

NetApp

/** * @author xuyi3 * @2016年9月13日 @上午9:32:43 * @NetApp * @功能说明:<br> * @春风十里不如你 * @备注 */public class NetApp{        public static void main(String[] args)        {            //初始化上网代理对象            NetProxy netProxy = new NetProxy();            netProxy.internet("admin", "123");        }}

动态代理

举例:数据库事务操作时,每次操作都要先开启事务然后再提交事务,这样模板式的代码频繁的出现,既不安全也繁琐.可以使用动态代理来帮助我们处理这些样式代码,即AOP面向切面编程。

应用

UserService

/** *  * @author xuyi3 * @2016年9月13日 @上午10:27:21 * @UserService * @功能说明:<br> * @春风十里不如你 * @备注 */public interface UserService{    void addUser(String username);}

UserServiceImpl

/** *  * @author xuyi3 * @2016年9月13日 @上午10:25:27 * @UserServiceImpl * @功能说明: * @春风十里不如你 * @备注 */public class UserServiceImpl implements UserService{        public void addUser(String username)        {            System.out.println("addUser ... username:" + username);        }}

PersonService

/** *  * @author xuyi3 * @2016年9月13日 @上午10:27:54 * @PersonService * @功能说明:<br> * @春风十里不如你 * @备注 */public interface PersonService{    void addPerson(String name);}

PersonServiceImpl

/** *  * @author xuyi3 * @2016年9月13日 @上午10:25:13 * @PersonServiceImpl * @功能说明:<br> * @春风十里不如你 * @备注 */public class PersonServiceImpl implements PersonService{        public void addPerson(String name)        {            System.out.println("addPerson... name:" + name);        }}

ObjectProxy

/** * 看其名字ObjectProxy就可以知道其是万能代理对象 * @author xuyi3 * @2016年9月13日 @上午10:28:30 * @ObjectProxy * @功能说明:<br> * @春风十里不如你 * @备注 */public class ObjectProxy implements InvocationHandler{        //待代理对象        private Object target;        /**         * <h3>通过构造方法传入需要使用的主题实现类对象</h3>         *          * @param target         */        public ObjectProxy(Object target)        {            this.target = target;        }        /**         * <h3>使用Proxy创建代理对象实例</h3>         * 核心方法         * @return         */        public Object createProxy()        {            return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);        }        /**         * @param proxy              * @param method             * @param args               * @return               * @throws Throwable         */        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable        {            beforeInvoke();            //      System.out.println(method.getName());// 输出执行方法名            Object result = method.invoke(target, args);            afterInvoke();            return result;        }        private void beforeInvoke()        {            System.out.println("begin事务 ...");        }        private void afterInvoke()        {            System.out.println("commit事务 ...");        }}

MainApp

/** *  * @author xuyi3 * @2016年9月13日 @上午9:53:40 * @MainApp * @功能说明:<br> * @春风十里不如你 * @备注 */public class MainApp{        public static void main(String[] args) throws Exception        {            UserService userService = new UserServiceImpl();            ObjectProxy objectProxy1 = new ObjectProxy(userService);            UserService userServiceProxy = (UserService) objectProxy1.createProxy();            userServiceProxy.addUser("admin");            System.out.println("------------------");            PersonService personService = new PersonServiceImpl();            ObjectProxy objectProxy2 = new ObjectProxy(personService);            PersonService personServiceProxy = (PersonService) objectProxy2.createProxy();            personServiceProxy.addPerson("xuyi");        }}

总结

代理设计模式是现实开发中比较常使用到的,同时动态代理也是Spring AOP面向切面技术的基础理论。
0 0
原创粉丝点击