• 设计模式——代理模式


    作者: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();

            }

    }

  • 相关阅读:
    ATM+购物车
    subprocess,re,logging模块
    json,pickle,collections,openpyxl模块
    time,datatime,random,os,sys,hashlib模块
    1.内置函数剩余部分 map reduce filter 2.函数递归 3.模块
    生成器,面向过程编程,三元表达式,列表生成式,生成器表达式,匿名函数,内置函数
    Ajax数据对接出问题了?ThingJS解决方法在这里
    测试
    简单低成本的物联网开发平台-ThingJS
    用ThingJS之CityBuilder快搭3D场景,可视化开发必备
  • 原文地址:https://www.cnblogs.com/haibiscuit/p/10526894.html
Copyright © 2020-2023  润新知