首页 > 其他 > 详细

学习设计模式3--代理模式

时间:2020-12-20 23:16:21      阅读:41      评论:0      收藏:0      [点我收藏+]

代理模式

结构

技术分享图片

  • Subject接口

    package 结构;
    
    /**
     * @Program: 设计模式
     * @Description: Subject类定义了 RealSubject和Proxy的共用接口,
     *               这样就能在任何能够使用RealSubject的地方使用Proxy了
     * @Author Mokairui
     * @Date 2020/12/5 11:46
     */
    public interface Subject {
    
        void request();
    
    }
    
    
  • RealSubject具体实现类

    package 结构;
    
    /**
     * @Program: 设计模式
     * @Description: 定义了Proxy所代表的真实实体
     * @Author Mokairui
     * @Date 2020/12/5 11:48
     */
    public class RealSubject implements Subject {
    
        @Override
        public void request() {
            System.out.println("真实的请求");
        }
    }
    
    
  • 代理对象

    package 结构;
    
    /**
     * @Program: 设计模式
     * @Description: 保存一个引用使得代理可以访问实体,并提供一个于Subject的接口相同的接口,
     *               这样代理就可以用来替代实体
     * @Author Mokairui
     * @Date 2020/12/5 11:50
     */
    public class Proxy implements Subject {
    
        private RealSubject realSubject;
    
        @Override
        public void request() {
            if (realSubject == null) {
                realSubject = new RealSubject();
            }
            // 调用方法,但是在这里就可以就可以添加你想要的额外功能等
            realSubject.request();
        }
    }
    
    
  • 测试

    package 结构;
    
    /**
     * @Program: 设计模式
     * @Description: 测试类
     * @Author Mokairui
     * @Date 2020/12/5 12:22
     */
    public class Demo {
    
        public static void main(String[] args) {
            Proxy proxy = new Proxy();
            proxy.request();
        }
    
    }
    
    

静态代理

技术分享图片

  • 礼物接口

    package example.静态;
    
    /**
     * @Program: 设计模式
     * @Description: 送礼物的接口
     * @Author Mokairui
     * @Date 2020/12/5 13:43
     */
    public interface IGiveGift {
    
        void GiveDolls();
    
        void GiveFlowers();
    
        void GiveChocolate();
    
    }
    
    
  • 被追求者

    package example.静态;
    
    /**
     * @Program: 设计模式
     * @Description: 被追求者
     * @Author Mokairui
     * @Date 2020/12/5 14:29
     */
    public class SchoolGirl {
    
        private String name;
    
        public SchoolGirl() {
        }
    
        public SchoolGirl(String name) {
            this.name = name;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
    }
    
    
  • 追求者

    package example.静态;
    
    /**
     * @Program: 设计模式
     * @Description: 追求者
     * @Author Mokairui
     * @Date 2020/12/5 13:44
     */
    public class Pursuit implements IGiveGift {
    
        private SchoolGirl schoolGirl;
    
        public void setSchoolGirl(SchoolGirl schoolGirl) {
            this.schoolGirl = schoolGirl;
        }
    
        @Override
        public void GiveDolls() {
            System.out.println(schoolGirl.getName() + "送你洋娃娃");
        }
    
        @Override
        public void GiveFlowers() {
            System.out.println(schoolGirl.getName() + "送你鲜花");
        }
    
        @Override
        public void GiveChocolate() {
            System.out.println(schoolGirl.getName() + "送你巧克力");
        }
    }
    
    
  • 代理类

    package example.静态;
    
    /**
     * @Program: 设计模式
     * @Description: 代理类
     * @Author Mokairui
     * @Date 2020/12/5 14:33
     */
    public class Proxy implements IGiveGift {
    
        private Pursuit pursuit;
    
        public void setPursuit(Pursuit pursuit) {
            this.pursuit = pursuit;
        }
    
        @Override
        public void GiveDolls() {
            System.out.println("我是代理了送洋娃娃,我可以在这里加额外需求");
            pursuit.GiveDolls();
    
        }
    
        @Override
        public void GiveFlowers() {
            System.out.println("我是代理了送鲜花,我可以在这里加额外需求");
            pursuit.GiveFlowers();
        }
    
        @Override
        public void GiveChocolate() {
            System.out.println("我是代理了送巧克力,我可以再这里加额外需求");
            pursuit.GiveChocolate();
        }
    }
    
    
  • 测试

    package example.静态;
    
    /**
     * @Program: 设计模式
     * @Description: 测试类
     * @Author Mokairui
     * @Date 2020/12/5 14:36
     */
    public class Demo {
        public static void main(String[] args) {
            SchoolGirl schoolGirl = new SchoolGirl("yanzi");
            Pursuit pursuit = new Pursuit();
            pursuit.setSchoolGirl(schoolGirl);
    
            Proxy proxy = new Proxy();
            proxy.setPursuit(pursuit);
    
            proxy.GiveDolls();
            System.out.println("-----------------");
            proxy.GiveFlowers();
            System.out.println("------------------");
            proxy.GiveChocolate();
        }
    }
    
    

技术分享图片

动态代理

JDK代理

技术分享图片

追求者和被追求者,送礼物的接口这里就不重复写了

  • DynamicProxyHandler类

    package example.动态.jdk;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    
    /**
     * @Program: 设计模式
     * @Description: 动态代理对象
     * @Author Mokairui
     * @Date 2020/12/5 13:08
     */
    public class DynamicProxyHandler implements InvocationHandler {
    
        private Pursuit pursuit;
    
        public DynamicProxyHandler(Pursuit pursuit) {
            this.pursuit = pursuit;
        }
    
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            Object result = null;
            if ("GiveDolls".equals(method.getName())) {
                // 用来区别增强的不同方法
                System.out.print("最最可爱的");
            }
    
            if ("GiveFlowers".equals(method.getName())) {
                // 针对不同的方法,增强不同的内容
                System.out.println("五颜六色的哦");
            }
            result = method.invoke(this.pursuit, args);
    
            return result;
        }
    
    }
    
    
  • 测试类

    package example.动态.jdk;
    
    import java.lang.reflect.Proxy;
    
    /**
     * @Program: 设计模式
     * @Description: 测试类
     * @Author Mokairui
     * @Date 2020/12/5 13:11
     */
    public class Demo {
        public static void main(String[] args) {
            Pursuit pursuit = new Pursuit();
            pursuit.setSchoolGirl(new SchoolGirl("yanzi"));
    
            IGiveGift proxy = (IGiveGift) Proxy.newProxyInstance(pursuit.getClass().getClassLoader()
                    , pursuit.getClass().getInterfaces()
                    , new DynamicProxyHandler(pursuit));
    
            proxy.GiveDolls();
            System.out.println("---------------------");
            proxy.GiveFlowers();
            System.out.println("---------------------");
            proxy.GiveChocolate();
        }
    }
    
    

技术分享图片

CGLIB代理

技术分享图片

  • 追求者的类,本来是实现接口,这里就变成了一个普通的类

    package example.动态.cglib;
    
    /**
     * @Program: 设计模式
     * @Description:
     * @Author Mokairui
     * @Date 2020/12/14 22:15
     */
    public class Pursuit {
    
        private SchoolGift schoolGift;
    
    
        public void setSchoolGift(SchoolGift schoolGift) {
            this.schoolGift = schoolGift;
        }
    
    
        public void giveDolls() {
            System.out.println("追求者送" + schoolGift.getName() + "娃娃");
        }
    
        public void giveFlowers() {
            System.out.println("追求者送" + schoolGift.getName() + "鲜花");
        }
    
        public void giveChocolate() {
            System.out.println("追求者送" + schoolGift.getName() + "巧克力");
        }
    }
    
    
  • 代理类

    package example.动态.cglib;
    
    import net.sf.cglib.proxy.MethodInterceptor;
    import net.sf.cglib.proxy.MethodProxy;
    
    import java.lang.reflect.Method;
    
    /**
     * @Program: 设计模式
     * @Description:
     * @Author Mokairui
     * @Date 2020/12/14 22:26
     */
    public class DynamicProxyCglibHandler implements MethodInterceptor {
    
        // 需要代理的对象
        private Pursuit pursuit;
    
        public DynamicProxyCglibHandler(Pursuit pursuit) {
            this.pursuit = pursuit;
        }
    
        /**
         * 代理的核心方法
         * @param proxy
         * @param method
         * @param args
         * @param methodProxy
         * @return
         * @throws Throwable
         */
        @Override
        public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
            Object obj = null;
            System.out.println("代理方法前");
            method.invoke(pursuit, args);
            System.out.println("代理方法后");
            return obj;
        }
    }
    
    
  • 测试类

    package example.动态.cglib;
    
    
    import net.sf.cglib.proxy.Enhancer;
    
    
    /**
     * @Program: 设计模式
     * @Description:
     * @Author Mokairui
     * @Date 2020/12/14 22:10
     */
    public class Demo {
    
        public static void main(String[] args) {
            SchoolGift schoolGift = new SchoolGift();
            schoolGift.setName("燕子");
            Pursuit pursuit = new Pursuit();
    
            pursuit.setSchoolGift(schoolGift);
    
            Pursuit proxy = (Pursuit) Enhancer.create(pursuit.getClass(),
                    new DynamicProxyCglibHandler(pursuit));
    
            proxy.giveDolls();
            System.out.println("-----------------");
            proxy.giveFlowers();
            System.out.println("----------------");
            proxy.giveChocolate();
    
        }
    
    }
    
    

技术分享图片

学习设计模式3--代理模式

原文:https://www.cnblogs.com/mokairui/p/14089790.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!