虛擬代理模式(Virtual PRoxy)會推遲真正所需對象實例化時間. 在須要真正的對象工做以前, 若是代理對象可以處理, 那麼暫時不須要真正對象來出手.java
優勢: 這種方法的優勢是,在應用程序啓動時,因爲不須要建立和裝載全部的對象,所以加速了應用程序的啓動。 面試
缺點: 由於不能保證特定的應用程序對象被建立,在訪問這個對象的任何地方,都須要檢測確認它不是空(null)。性能的下降上不單單是多了一句代碼這麼簡單, ` if ` 這種跳轉類語句的頗有可能會阻塞CPU的指令流水, 雖然有分值預測技術, 可是分支預測也是有命中率的....
app
仍是回過頭講講本文的主題吧....ide
舉個例子: 有一批人來找老闆談事情, 談事情以前須要預定, 將這些預定添加到計劃列表裏. "將預定添加到計劃列表裏"這件事, 自己並不須要老闆親自現身, 老闆再也不的時候徹底能夠找一個助手來代作, 只有執行任務計劃列表裏的任務時, 老闆才需現身處理(場景就是: 你們都是來找老闆作事的, 並非來找助手作事的, 助手只負責在老闆不在的時候幫老闆收集你們的需求, 最後收集完了, 他就把老闆邀請過來, 老闆來處理全部的事情).性能
老闆和助手都須要實現這個接口.this
助手實現這個接口, 當調用助手的approve方法時, 助手就會去邀請老闆過來, 讓老闆處理清單.代理
老闆實現這個接口, 是由於這些清單就須要老闆來處理(approve)對象
public interface Approvable { void approve() ; }
老闆是有身價的, 來一趟不容易, 因此小事交給助手作(就好比: 收集訪客們找老闆有什麼事情, 並統計出一個清單). 不必一上來就把老闆叫出來.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(); } }
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); } } } } }
用於運行, 場景模擬
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(); } }