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();

            }

    }

  • 相关阅读:
    IDEA中Git实战
    高并发下redis缓存穿透问题解决方案
    springboot整合mybatis+generator
    Github修改项目显示的语言类型
    Github中README.md换行
    maven中可以直接引用的java系统属性和环境变量属性
    springboot启动异常java.lang.NoSuchFieldError: DEFAULT_INCOMPATIBLE_IMPROVEMENTS
    java获取Linux持续运行时间及友好显示
    http工具类
    idHTTP最简洁的修改和取得Cookie例子
  • 原文地址:https://www.cnblogs.com/haibiscuit/p/10526894.html
Copyright © 2011-2022 走看看