zoukankan      html  css  js  c++  java
  • 设计模式——代理模式

    作者:haibiscuit

    时间:2019:3:13

    您的star是我不断前行的动力

    https://github.com/haibiscuit

    转载请说明出处

    :代理模式

       1.代理模式分静态代理,动态代理,cglib代理方式

       这里只分析静态代理和动态代理

       2.Spring中的Aop的底层原理就是使用的代理方式

       示例:    //直接上代码,代码就是最好的解释

       1.静态代理

            //接口

            public interface IUserDao {

                void save();

            }

            //接口实现,目标对象

            public class UserDao implements IUserDao {

                @Override

                public void save() {

                    System.out.println("----已经保存数据!----");

                }

            }

            //代理类

            public class UserDaoProxy implements IUserDao{

                //接收保存目标对象

                private IUserDao target;

                public UserDaoProxy(IUserDao target){

                    this.target=target;

                }

                public void save() {

                    System.out.println("开始事务...");

                    target.save();//执行目标对象的方法

                    System.out.println("提交事务...");

                }

            }

            //测试类

            class Test{

                public static void main(String []args){

                     //目标对象

                    UserDao target = new UserDao();

                    //代理对象,把目标对象传给代理对象,建立代理关系

                    UserDaoProxy proxy = new UserDaoProxy(target);

                    proxy.save();//执行的是代理的方法

                }

            }

     

        (2).动态代理

        /**

         * 创建动态代理对象

         * 动态代理不需要实现接口,但是需要指定接口类型

         */

        public class ProxyFactory{

            //维护一个目标对象

            private Object target;

            public ProxyFactory(Object target){

                this.target=target;

            }

           //给目标对象生成代理对象

            public Object getProxyInstance(){

                return Proxy.newProxyInstance(

                        target.getClass().getClassLoader(),

                        target.getClass().getInterfaces(),

                        new InvocationHandler() {

                            @Override

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

                                System.out.println("开始事务2");

                                //运用反射执行目标对象方法

                                Object returnValue = method.invoke(target, args);

                                System.out.println("提交事务2");

                                return returnValue;

                            }

                        }

                );

            }

        }

        //测试类

        public class Test {

            public static void main(String[] args) {

                // 目标对象

                IUserDao target = new UserDao();

                // 给目标对象,创建代理对象

                IUserDao proxy = (IUserDao) new ProxyFactory(target).getProxyInstance();

                // 执行方法

                proxy.save();

            }

    }

  • 相关阅读:
    linux的常用命令
    linux系统环境与文件权限
    MySQL常用数据类型
    【bzoj4641】基因改造 特殊匹配条件的KMP
    【bzoj4550】小奇的博弈 博弈论+dp
    【bzoj3991】[SDOI2015]寻宝游戏 树链的并+STL-set
    【bzoj1304】[CQOI2009]叶子的染色 树形dp
    【bzoj4715】囚人的旋律 dp
    【bzoj4008】[HNOI2015]亚瑟王 概率dp
    【bzoj4444】[Scoi2015]国旗计划 倍增
  • 原文地址:https://www.cnblogs.com/haibiscuit/p/10526894.html
Copyright © 2011-2022 走看看