虚拟代理模式-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) {
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();
}
}

最新文章

  1. innerHTML on ie6-9
  2. MRDS学习三——机械车的改良(Activity的介绍)
  3. Mac iTerm2命令行快捷操作
  4. ssh 协议执行repo sync 报错:Permission denied (publickey)
  5. 为什么在SQL Server2008在视图中修改表结构无效
  6. linux 安装jdk 配置tomcat
  7. 第一章:windows下 python 的安装和使用
  8. 如何架构一个合适的企业API网关
  9. Web Service进阶(七)浅谈SOAP Webservice和RESTful Webservice
  10. SQL Server GUID 数据迁移至MongoDB后怎样查看?
  11. 2019-04-03 研究EasyWeb有感
  12. Centos解除端口占用
  13. postgresql数据库删除时提示回话 sessions using the database
  14. 软件工程实践小项目之模拟wc.exe的小程序
  15. less 前端css利器 工程化、逻辑化 css 文件
  16. leaflet入门(五)API翻译(下)
  17. hdu 5411 CRB and Puzzle (矩阵高速幂优化dp)
  18. java 事务
  19. 【COGS】2287:[HZOI 2015]疯狂的机器人 FFT+卡特兰数+排列组合
  20. C语言运算符优先级及结合性

热门文章

  1. Python3 小技巧
  2. json-sever 配置与应用
  3. windows笔记本触摸板的快捷键教程
  4. logback日志框架的简单使用
  5. react dnd demo2
  6. QTableWidget class
  7. 系统运行缓慢,CPU 100%,以及Full GC次数过多问题的排查思路
  8. mysql中将多行数据合并成一行数据
  9. linux系统设置cpu孤立
  10. CSS中字距,词距,首行缩进,字体大小,排版相关问题的探讨