虚拟代理模式-Virtual Proxy(Java实现)
2018-06-18 00:58:34来源:未知 阅读 ()
虚拟代理模式-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(); } }
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:AOP
下一篇:021.9 IO流 流总结
- 代理项 Surrogate 2020-06-11
- 设计模式-委派/策略模式 2020-06-09
- Java跨平台原理(字节码文件、虚拟机) 以及Java安全性 2020-06-07
- 深入理解:设计模式中的七大设计原则 2020-06-07
- 设计模式---类之间的关系知多少 2020-06-07
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash