zoukankan      html  css  js  c++  java
  • 设计模式-代理模式(Proxy)

    代理模式是构造型模式的一种,它可以为其他对象提供一种代理以控制对这个对象的访问。

    所为代理,是具有与代理元(被代理的对象)(RealSubject)具有相同的接口(Subject)的类。

    角色和职责:

    1.抽象主题(subject)-Subject:

      抽象主题公共接口

    2.具体主题(RealSubject)-RealSubject:

        代理角色所代表的真实对象

    3.代理主题(Proxy)-StaticProxySubject、DynamicProxySubject:

        含有对真实主题角色的引用,代理角色通常在将客户端调用传递给真实主题之前或者之后执行某些操作,而不是单纯返回真实的对象

    代理模式分为静态代理和动态代理

    UML图:

    具体代码:

    /**
     * 卖书
     */
    public interface Subject {
        void doAction();//卖书
    }
    /**
     * 出版社卖书
     */
    public class RealSubject implements Subject{
        @Override
        public void doAction() {
            System.out.println("卖书");
        }
    }
    /**
     * 静态代理:当当网卖书
     */
    public class StaticProxySubject implements Subject{
        private RealSubject realSubject;
    
        public StaticProxySubject(){
            this.realSubject = new RealSubject();//出版社
        }
    
        @Override
        public void doAction() {
            this.discount();//打折
            this.realSubject.doAction();//卖书
            this.give();//送礼品
        }
    
        /**
         * 打折
         */
        private void discount(){
            System.out.println("打折");
        }
    
        /**
         * 送礼品
         */
        private void give(){
            System.out.println("送礼品");
        }
    }
    /**
     * 动态代理
     */
    public class DynamicProxySubject implements InvocationHandler {
        private RealSubject realSubject;
    
        public DynamicProxySubject(){
            this.realSubject = new RealSubject();
        }
    
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            this.discount();//打折
            Object obj = method.invoke(realSubject,args);
            this.give();//送礼品
            return obj;
        }
    
        /**
         * 打折
         */
        private void discount(){
            System.out.println("打折");
        }
    
        /**
         * 送礼品
         */
        private void give(){
            System.out.println("送礼品");
        }
    }
    import java.lang.reflect.Proxy;
    
    public class Main {
        public static void main(String[] args) {
            //静态代理
            StaticProxySubject staticProxySubject = new StaticProxySubject();
            staticProxySubject.doAction();//卖书
            System.out.println("----------------------------");
    
            //动态代理
            DynamicProxySubject dynamicProxySubject = new DynamicProxySubject();
            Subject subject = (Subject) Proxy.newProxyInstance(Subject.class.getClassLoader(), new Class[]{Subject.class},dynamicProxySubject);
            subject.doAction();//卖书
        }
    }

     项目源码:https://github.com/qjm201000/design_pattern_proxy.git

  • 相关阅读:
    linux常用命令
    linux下redis配置
    Git使用命令
    linux学习笔记
    NOPI读取Excel2003、Excel2007或更高级的兼容性问题
    netcore开发常用命令
    netcore3.0 dotnet ef执行报错
    vscode配置nuget常见问题
    PDMReader结合PowerDesigner导出word格式数据字典
    微信网页授权开发遇到问题
  • 原文地址:https://www.cnblogs.com/qjm201000/p/10066324.html
Copyright © 2011-2022 走看看