设计模式——代理模式

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

        }

}

原文地址:https://www.cnblogs.com/haibiscuit/p/10526894.html