• Java: Proxy Pattern


    /**
     * 版权所有 2022 涂聚文有限公司
     * 许可信息查看:
     * 描述:
     * 代理模式 Proxy Patterns
     * 历史版本: JDK 14.02
     * 2022-09-12 创建者 geovindu
     * 2022-09-12 添加 Lambda
     * 2022-09-12 修改:date
     * 接口类
     * 2022-09-12 修改者:Geovin Du
     * 生成API帮助文档的指令:
     *javadoc - -encoding Utf-8 -d apidoc Searcher.java
     *
     * */
    
    
    package com.javapatterns.proxy;
    
    
    /**
     * 抽象主题
     * @author geovindu
     * */
    public interface Searcher
    {
        /**
         * 声明一个抽象方法
         * */
        String doSearch(String userId, String searchType);
    }
    
    /**
     * 版权所有 2022 涂聚文有限公司
     * 许可信息查看:
     * 描述:
     * 代理模式 Proxy Patterns
     * 历史版本: JDK 14.02
     * 2022-09-12 创建者 geovindu
     * 2022-09-12 添加 Lambda
     * 2022-09-12 修改:date
     * 接口类
     * 2022-09-12 修改者:Geovin Du
     * 生成API帮助文档的指令:
     *javadoc - -encoding Utf-8 -d apidoc RealSearcher.java
     *
     * */
    
    
    package com.javapatterns.proxy;
    
    /**
     *真实主题
     * @author geovindu
     *
     * */
    public class RealSearcher  implements Searcher{
    
    
        /**
         *
         *构造子
         * */
        public RealSearcher()
        {
        }
        /**
         *
         *真实的查询的工作在这里发生
         * @param userId
         * @param keyValue
         * @return
         * */
        public String doSearch(String userId, String keyValue)
        {
            String sql = "SELECT * FROM data_table WHERE key_col = '" + keyValue + "'";
    
            //execute this SQL Statement and concatenate a result string
            return "result set 涂聚文";
        }
    
    }
    

      

    /**
     * 版权所有 2022 涂聚文有限公司
     * 许可信息查看:
     * 描述:
     * 代理模式 Proxy Patterns
     * 历史版本: JDK 14.02
     * 2022-09-12 创建者 geovindu
     * 2022-09-12 添加 Lambda
     * 2022-09-12 修改:date
     * 接口类
     * 2022-09-12 修改者:Geovin Du
     * 生成API帮助文档的指令:
     *javadoc - -encoding Utf-8 -d apidoc AccessValidator.java
     *
     * */
    
    
    package com.javapatterns.proxy;
    /**
     *用户权限检查对象
     * @author geovindu
     * */
    public class AccessValidator {
        /**
         *
         *用户权限检查
         * */
        public boolean vaidateUser(String userId)
        {
            if (userId.equals("geovindu"))
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    
    }
    

      

    /**
     * 版权所有 2022 涂聚文有限公司
     * 许可信息查看:
     * 描述:
     * 代理模式 Proxy Patterns
     * 历史版本: JDK 14.02
     * 2022-09-12 创建者 geovindu
     * 2022-09-12 添加 Lambda
     * 2022-09-12 修改:date
     * 接口类
     * 2022-09-12 修改者:Geovin Du
     * 生成API帮助文档的指令:
     *javadoc - -encoding Utf-8 -d apidoc UsageLogger.java
     *
     * */
    
    
    package com.javapatterns.proxy;
    /**
     *
     *
     * */
    public class UsageLogger {
    
    
        private String userId;
    
        /**
         *用户Id 赋值方法
         *
         * */
        public void setUserId(String userId)
        {
            this.userId = userId;
        }
        /**
         *保存至日志中
         *
         * */
        public void save()
        {
            String sql = "INSERT INTO USAGE_TABLE (user_id) " +
                    " VALUES(" + userId + ")";
             System.out.println("已在保存日志!操作用户 "+userId);
            //execute this SQL statement
        }
        /**
         *
         *保存至日志中
         * */
        public void save(String userId)
        {
            this.userId = userId;
    
            save();
        }
    
    
    }
    

      

    /**
     * 版权所有 2022 涂聚文有限公司
     * 许可信息查看:
     * 描述:
     * 代理模式 Proxy Patterns
     * 历史版本: JDK 14.02
     * 2022-09-12 创建者 geovindu
     * 2022-09-12 添加 Lambda
     * 2022-09-12 修改:date
     * 接口类
     * 2022-09-12 修改者:Geovin Du
     * 生成API帮助文档的指令:
     *javadoc - -encoding Utf-8 -d apidoc Proxy.java
     *
     * */
    
    package com.javapatterns.proxy;
    
    /**
     *代理角色
     * @author geovindu
     * */
    public class Proxy implements Searcher {
    
    
        /**
         * @link aggregation
         * @directed
         */
        private RealSearcher searcher;
    
        /**
         * @link aggregation
         * @directed
         */
        private UsageLogger usageLogger;
    
        /**
         * @link aggregation
         * @directed
         */
        private AccessValidator accessValidator;
    
        /**
         *构造子
         *
         * */
        public Proxy()
        {
            searcher = new RealSearcher();
        }
    
        /**
         *实现查询操作
         * @param userId  用户ID
         * @param keyValue  搜索的关键字
         * @return  返回字符串
         * */
        public String doSearch(String userId, String keyValue)
        {
            if (checkAccess(userId))
            {
                String result = searcher.doSearch(null, keyValue);
                logUsage(userId);
    
                return result;
            }
            else
            {
                return null;
            }
        }
    
        /**
         *查询前的权限操作
         * @param userId  用户ID
         * @return  逻辑真假
         * */
        private boolean checkAccess(String userId)
        {
            accessValidator = new AccessValidator();
    
            return accessValidator.vaidateUser(userId);
        }
    
        /**
         *查询后的日日操作(登记)
         * @param userId  用户ID
         *
         * */
        private void logUsage(String userId)
        {
            UsageLogger logger = new UsageLogger();
    
            logger.setUserId(userId);
    
            logger.save();
        }
    
    }
    

      

    调用测试:、

                //代理模式
                searcher = new Proxy();
                String userId = "geovindu";
                String searchType = "SEARCH_BY_ACCOUNT_NUMBER";
                String result = searcher.doSearch(userId, searchType);
                System.out.println(result);
    

      

    输出:

    已在保存日志!操作用户 geovindu
    result set 涂聚文
    

      

      

    /**
     * 版权所有 2022 涂聚文有限公司
     * 许可信息查看:
     * 描述:
     * 代理模式 Proxy Patterns
     * 历史版本: JDK 14.02
     * 2022-09-12 创建者 geovindu
     * 2022-09-12 添加 Lambda
     * 2022-09-12 修改:date
     * 接口类
     * 2022-09-12 修改者:Geovin Du
     * 生成API帮助文档的指令:
     *javadoc - -encoding Utf-8 -d apidoc ImageIconProxy.java
     *
     * */
    
    
    package com.javapatterns.proxy;
    
    import java.awt.Graphics;
    import java.awt.Component;
    import javax.swing.ImageIcon;
    import javax.swing.Icon;
    import javax.swing.SwingUtilities;
    
    /**
     *代理角色
     * @author geovindu
     *
     * */
    public class ImageIconProxy implements Icon
    {
        private ImageIcon realIcon = null;
        private String imageName;
        private int width;
        private int height;
        boolean isIconCreated = false;
        /**
         *构造子
         * @param imageName
         * @param width
         * @param height
         * */
        public ImageIconProxy(String imageName, int width, int height)
        {
            this.imageName = imageName;
            this.width = width;
            this.height = height;
        }
        /**
         *图像高度取值方法
         * @return
         * */
        public int getIconHeight()
        {
            return realIcon.getIconHeight();
        }
        /**
         *图像宽度取值
         * @return
         * */
        public int getIconWidth()
        {
            return realIcon.getIconWidth();
        }
    
        // The proxy's paint() method is overloaded to draw a border
        // and a message "Loading author's photo.." while the image
        // loads. After the image has loaded, it is drawn. Notice
        // that the proxy does not load the image until it is
        // actually needed.
        /**
         *加载图像
         * @param c
         * @param g
         * @param x
         * @param y
         * */
        public void paintIcon(final Component c, Graphics g, int x, int y)
        {
            if(isIconCreated)
            {
                realIcon.paintIcon(c, g, x, y);
                g.drawString("Java Design Patterns by Geovin Du(涂聚文)", x+20, y+370);
            }
            else
            {
                g.drawRect(x, y, width-1, height-1);
                g.drawString("Loading author's photo...", x+20, y+20);
    
                // The image is being loaded on another thread.
                synchronized(this)
                {
                    SwingUtilities.invokeLater(new Runnable()
                    {
                        public void run()
                        {
                            try
                            {
                                // Slow down the image-loading process.
                                Thread.currentThread().sleep(2000);
    
                                // ImageIcon constructor creates the image.
                                realIcon = new ImageIcon(imageName);
                                isIconCreated = true;
                            }
                            catch(InterruptedException ex)
                            {
                                ex.printStackTrace();
                            }
                            // Repaint the icon's component after the
                            // icon has been created.
                            c.repaint();
                        }
                    });
                }
            }
        }
    }
    

      

    package com.javapatterns.proxy;
    
    import java.awt.Graphics;
    import java.awt.Insets;
    import javax.swing.JFrame;
    import javax.swing.Icon;
    
    /**
     *客户端代码实现
     * @author geovindu
     *
     * */
    public class ImageClient extends JFrame{
    
        private static int IMAGE_WIDTH = 270;
        private static int IMAGE_HEIGHT = 380;
    
        private Icon imageIconProxy = null;
        /**
         *构造子
         * */
        public ImageClient()
        {
            super("图像画像Virtual Proxy Client ");
            imageIconProxy = new ImageIconProxy("resource/geovindu.jpg", IMAGE_WIDTH, IMAGE_HEIGHT);
    
            setBounds(200, 200, IMAGE_WIDTH + 10, IMAGE_HEIGHT + 30);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
        /**
         *实理画像
         * @param g
         *
         * */
        public void paint(Graphics g)
        {
            super.paint(g);
            Insets insets = getInsets();
            imageIconProxy.paintIcon(this, g, insets.left , insets.top);
        }
    }
    

      

    调用测试:

                //代理模式
                ImageClient app = new ImageClient();
                app.show();
    

      

    输出:

  • 相关阅读:
    1 step / 2 step STO
    关于Shipping
    Retail Article Master Data 学习 (四) Assortment
    SAP Basis 性能分析 记忆点
    从数据库中读取二进制数据,并显示图片
    [转]c#金山词霸组件法
    C# 处理INI文个类 INIManager
    C#实现通过HttpWebRequest发送POST请求实现网站自动登陆
    XPath语法参考
    关于IE6和IE7关闭窗口时提示和不提示以及上传图片前的本地预览解决办法
  • 原文地址:https://www.cnblogs.com/geovindu/p/16704178.html
Copyright © 2020-2023  润新知