虛擬代理模式-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();
    }
}

相關文章
相關標籤/搜索