設計模式----代理模式
阿新 • • 發佈:2021-08-24
今天來介紹一種相對簡單的設計模式 ---- 代理模式
比如說你想追一位女生,但是你跟她不熟,就可以找一個你和她都很熟的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)智慧指引:是指當呼叫真實的物件時,代理處理另外一件事 * */