1. 程式人生 > 其它 >設計模式----代理模式

設計模式----代理模式

今天來介紹一種相對簡單的設計模式 ---- 代理模式

比如說你想追一位女生,但是你跟她不熟,就可以找一個你和她都很熟的Proxy(代理)去完成你想要進行的動作

不要想歪哦,我說的是送禮物之類的 (doge)

我們首先來看這個設計模式的類圖

是不是很簡單哇~

看看程式碼~

package proxy.template;

/**@author 陳柏宇
 * Subject類,定義了 RealSubject 和 Proxy(代理) 的共用介面,這樣就在任何使用RealSubject
 * 的地方都可以使用Proxy(代理)
 * 這個類裡面的方法也就是 RealSubject 希望 Proxy(代理) 代理的方法
 
*/ public abstract class Subject { /** * 抽象方法,RealSubject 希望 Proxy(代理) 代理的方法 */ public abstract void request(); }
package proxy.template;

/**
 * @author 陳柏宇
 * 真實實體 真正意願的實體
 */

public class RealSubject extends Subject{
    @Override
    public void request() {
        System.out.println(
"真實實體的請求"); } }
package proxy.template;

/**
 * @author 陳柏宇
 * 代理者 代理真實實體的動作
 */

public class Proxy extends Subject{
    RealSubject realSubject;

    @Override
    public void request() {
        if(realSubject == null)
        {
            realSubject = new RealSubject();
        }
        realSubject.request();
    }
}

客戶端程式碼:

 public static void main(String[] args) {

        Proxy proxy = new Proxy();
        proxy.request();

    }

終端顯示:

真實實體的請求

接下來我們來看一個例子:比如說你想追一位女生,你讓一個人來代理你的動作

package proxy;

/**
 * @author 陳柏宇
 * 送禮物介面 代理者代理的我要送的禮物
 */

public abstract class IGivePresent {
    /**
     * 送玩偶 (不是Hong Kong的那位)
     */
    public abstract void giveDoll();
    /**
     * 送巧克力
     */
    public abstract void giveChocolate();
    /**
     * 送鮮花
     */
    public abstract void giveFlower();

}
package proxy;

/**
 * @author 陳柏宇
 * 追求者 動作的意願發起者
 */

public class Pursuit extends IGivePresent{
    SchoolGirl mm;

    public Pursuit(SchoolGirl mm) {
        this.mm = mm;
    }

    @Override
    public void giveDoll() {
        System.out.println( "送你玩偶,我親愛的" + mm.getName());
    }

    @Override
    public void giveChocolate() {
        System.out.println( "送你巧克力,我親愛的" + mm.getName());
    }

    @Override
    public void giveFlower() {
        System.out.println( "送你鮮花,我親愛的" + mm.getName());
    }
}
package proxy;

/**
 * @author 陳柏宇
 * 代理,用來發出追求者想發出的動作
 */

public class Proxy extends IGivePresent{
    Pursuit pursuit;

    public Proxy(SchoolGirl mm) {
        this.pursuit = new Pursuit(mm);
    }

    @Override
    public void giveDoll() {
        pursuit.giveDoll();
    }

    @Override
    public void giveChocolate() {
        pursuit.giveChocolate();
    }

    @Override
    public void giveFlower() {
        pursuit.giveFlower();
    }
}

main函式:

public class ProxyTest {
    public static void main(String[] args) {
        SchoolGirl mm = new SchoolGirl("beauty");

        Proxy p = new Proxy(mm);

        p.giveChocolate();
        p.giveDoll();
        p.giveFlower();
        
    }
}

控制檯輸出:

送你巧克力,我親愛的beauty
送你玩偶,我親愛的beauty
送你鮮花,我親愛的beauty

是不是很簡單呀~

那麼這個設計模式有哪些應用呢?

/**
 * @author cby
 * 那麼這種設計模式一般用在什麼場合呢?
 * 
 * (1)遠端代理,也就是為一個物件在不同的地址空間提供區域性代表,這樣可以隱藏一個物件
 * 存在於不同地址空間的事實
 *    就好比一個快捷方式,我們的桌面圖示的應用往往都不在桌面的那個資料夾裡
 *    
 * (2)虛擬代理,根據需要建立開銷很大的物件,通過它來存放例項化需要很長時間的真實物件
 *    比如你開啟一個很大的HTML網頁時裡面可能有很多的圖片和文字,但是你還是可以很快開啟它
 *    此時你所看到的是所有的文字,但是圖片是一張張下載才可以看到,那些未開啟的圖片框,
 *    就是通過虛擬代理來替代了真實的圖片,此時代理儲存了真實圖片的路徑和尺寸
 *    
 * (3)安全代理,用來控制真實物件訪問時的許可權
 *    
 * (4)智慧指引:是指當呼叫真實的物件時,代理處理另外一件事
 *      
 */