2010年5月18日 星期二

Design Pattern : 21 Proxy

有的物件在初始化時,需要消耗較大的系統效能,也比較花費時間
若要加速整個系統的初始化效能,不至於loading過久
如果可以讓物件在真正被使用時,才被實體化
那就可以加速整個系統的初始化載入
這就是Proxy Pattern所要提供的功能

原本的程式執行流程是,
一開始先初始化物件 real=new Real()
要執行功能時就呼叫物件的method real.method()
若改成利用Proxy Pattern
則是變成,在要執行物件的功能時
才去初始化物件實體,並呼叫其功能
而在這裡,讓功能物件與使用的Proxy繼承自相同的Interface
因為具備有相同的method

這樣你就可以在外部程式很輕鬆的切換並決定是否要使用proxy
或在Prxoy內作一些額外的處理後,再傳遞給真正的執行物件
參與者
1.Printable Interface
定義一個執行物件與Proxy的共通介面
public interface Printable {
    public void print(String msg);
}

2.Printer 真正的功能執行物件
實作介面所定義的必要功能
public class Printer implements Printable {
    @Override
    public void print(String msg) {
        System.out.print("Run Print="+msg);
    }
}

3.PrinterProxy
在Proxy內儲存了一個真正執行物件的實體(real)
而在實作功能上,才去初始化產生出物件
並執行功能
public class PrinterProxy implements Printable {
    private Printer real;
    @Override
    public void print(String msg) {        
        if(real==null){
            real=new Printer();            
        }
        real.print("From Proxy:"+msg);
    }
}

4.Main外部應用程式
可以很簡單的切換使用proxy或物件本體
去執行功能
public static void main(String[] args) {
    PrinterProxy myP=new PrinterProxy();
    //Printer myP=new Printer();
    myP.print("HELLO");
}

沒有留言: