虚拟代理模式-Virtual Proxy(Java实现)

虚拟代理模式-Virtual Proxy

虚拟代理模式(Virtual PRoxy)会推迟真正所需对象实例化时间. 在须要真正的对象工做以前, 若是代理对象可以处理, 那么暂时不须要真正对象来出手.java

优势: 这种方法的优势是,在应用程序启动时,因为不须要建立和装载全部的对象,所以加速了应用程序的启动。 面试

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

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

举个例子: 有一批人来找老板谈事情, 谈事情以前须要预定, 将这些预定添加到计划列表里. "将预定添加到计划列表里"这件事, 自己并不须要老板亲自现身, 老板再也不的时候彻底能够找一个助手来代作, 只有执行任务计划列表里的任务时, 老板才需现身处理(场景就是: 你们都是来找老板作事的, 并非来找助手作事的, 助手只负责在老板不在的时候帮老板收集你们的需求, 最后收集完了, 他就把老板邀请过来, 老板来处理全部的事情).性能

Approvable接口

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

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

老板实现这个接口, 是由于这些清单就须要老板来处理(approve)对象

public interface Approvable {
    void approve() ;
}

Boss类

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

import java.util.LinkedList;
import java.util.List;

public class Boss implements Approvable {
    List<String> orders;

    {
        System.out.println("\nBoss出现...\n");

    }

    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();
    }
}

相关文章
相关标签/搜索