zoukankan      html  css  js  c++  java
  • 虚拟代理模式-Virtual Proxy(Java实现)

    虚拟代理模式-Virtual Proxy

    虚拟代理模式(Virtual PRoxy)会推迟真正所需对象实例化时间. 在需要真正的对象工作之前, 如果代理对象能够处理, 那么暂时不需要真正对象来出手.

    优点: 这种方法的优点是,在应用程序启动时,由于不需要创建和装载所有的对象,因此加速了应用程序的启动。 

    缺点: 因为不能保证特定的应用程序对象被创建,在访问这个对象的任何地方,都需要检测确认它不是空(null)。性能的降低上不仅仅是多了一句代码这么简单, ` if ` 这种跳转类语句的很有可能会阻塞CPU的指令流水, 虽然有分值预测技术, 但是分支预测也是有命中率的....

    还是回过头讲讲本文的主题吧....

    举个例子: 有一批人来找老板谈事情, 谈事情之前需要预约, 将这些预约添加到计划列表里. "将预约添加到计划列表里"这件事, 本身并不需要老板亲自现身, 老板不再的时候完全可以找一个助手来代做, 只有执行任务计划列表里的任务时, 老板才需现身处理(场景就是: 大家都是来找老板做事的, 并不是来找助手做事的, 助手只负责在老板不在的时候帮老板收集大家的需求, 最后收集完了, 他就把老板邀请过来, 老板来处理所有的事情).

    Approvable接口

    老板和助手都需要实现这个接口.

    助手实现这个接口, 当调用助手的approve方法时, 助手就会去邀请老板过来, 让老板处理清单.

    老板实现这个接口, 是因为这些清单就需要老板来处理(approve)

    public interface Approvable {
        void approve() ;
    }

    Boss类

    老板是有身价的, 来一趟不容易, 所以小事交给助手做(就比如: 收集访客们找老板有什么事情, 并统计出一个清单). 没必要一上来就把老板叫出来.

    import java.util.LinkedList;
    import java.util.List;
    
    public class Boss implements Approvable {
        List<String> orders;
    
        {
            System.out.println("
    Boss出现...
    ");
    
        }
    
        public Boss() {
            this.orders = new LinkedList<>();
        }
    
        public Boss(List<String> orders) {
            if (orders != null) {
                this.orders = orders;
            } else {
                this.orders = new LinkedList<>();
            }
        }
    
        public void addOrder(String order) {
            this.orders.add(order);
        }
    
        @Override
        public void approve() {
            while(orders.size()>0){
                String order = orders.remove(0);
                System.out.println("Boss处理了任务<" + order + ">");
            }
            System.out.println();
        }
    }

    Assistant类

    Boss的代理类, 老板的助手.

    import java.util.LinkedList;
    import java.util.List;
    
    /**
     * Boss的代理
     * 负责收集orders列表, 处理清单之前的收集工作就不用老板现身了,
     * 老板可以晚一点出现
     */
    public class Assistant implements Approvable {
        List<String> orders;
        volatile Boss boss;
    
        public Assistant() {
            orders = new LinkedList<>();
        }
    
        public void addOrder(String order) {
            if (boss != null) {
                System.out.println("Boss亲自将<" + order + ">任务添加到列表");
                boss.addOrder(order);
            } else {
                System.out.println("助手将<" + order + ">任务添加到列表");
                this.orders.add(order);
            }
        }
    
        @Override
        public void approve() {
            inviteBoss();
            boss.approve();
        }
    
        private void inviteBoss() {
            if (boss == null) {
                synchronized (this) {
                    if (boss == null) {
                        boss = new Boss(orders);
                    }
                }
            }
        }
    }

    Main

    用于运行, 场景模拟

    public class Main {
        public static void main(String[] args) {
            // 有很多人来找老板, 老板在忙, 助手先把所有事情安置好
            Assistant assistant = new Assistant();
            assistant.addOrder("我找Boss面试");
            assistant.addOrder("我找Boss借钱");
            assistant.addOrder("我找Boss聊天");
    
            // 收集好了, 助手的职责就完成了, 把Boss叫出来, 让Boss处理. 或者说approve这件事,助手是做不了的, 只能叫出Boss来做.
            assistant.approve();
    
            // Boss刚才就被邀请过来, 现在就在现场. 所以就不需要助手转告给Boss了. 大家告诉助手的事情, Boss也会听到
            assistant.addOrder("我找Boss吃饭");
            assistant.addOrder("我找Boss喝酒");
            assistant.approve();
        }
    }

  • 相关阅读:
    python编写规范
    我们分析了400位华语歌手的歌词,发现人们重点关注的人事物情
    外部厂商公开工具
    OSI七层与TCP/IP五层网络架构详解
    npm run dev--The 'mode' option has not been set, webpack will fallback to 'production' for this value
    webpack-dev-server --inline --progress --config build/webpack.dev.conf.js
    PPTV(pplive)_forap_1084_9993.exe 木马清除经历
    【转】【Nginx】Nginx 入门教程 + 常用配置解析
    【转】【Python】Python 中文编码报错
    【Centos】systemd入门教程
  • 原文地址:https://www.cnblogs.com/noKing/p/9062329.html
Copyright © 2011-2022 走看看