• 设计模式——代理模式


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

            }

    }

  • 相关阅读:
    SQL Server 2008数据库镜像+故障转移集群原理摘自网络
    AHCI和IDE区别,和在目前系统中设置 AHCI 摘自网络
    中国计算机技术职业资格网(软考 官方 官网)
    第十一节 导出Excel 简单
    第五章 IF语句与逻辑运算符 简单
    第十一节 10图片权限控制 简单
    第四章 C++数据类型 简单
    第二章 从一个最简短的C++程 简单
    php 解析xml文件 简单
    第十一节 6HttpHandler案例 简单
  • 原文地址:https://www.cnblogs.com/haibiscuit/p/10526894.html
Copyright © 2020-2023  润新知