设为首页 加入收藏

TOP

Java实现虚拟代理模式-Virtual Proxy(一)
2018-06-04 08:51:14 】 浏览:145
Tags:Java 实现 虚拟 代理 模式 -Virtual Proxy

虚拟代理模式-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("\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) {
        &n

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Java集合类的详解与应用 下一篇Dubbo性能参数调优及原理

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目