http://www.books.com.tw/products/0010750585
chap15.
代理模式 Proxy
目的:為一個物件提供代理物件
虛擬代理(Virtual Proxy):用比較不消耗資源的代理物件來代替實際物件,實際物件只有在真正需要才會被創造。
遠程代理(Remote Proxy):在本地端提供一個代表物件來存取遠端網址的物件
保護代理(Protect Proxy):限制其他程式存取權限
智能代理(Smart Reference Proxy):為被代理的物件增加一些動作
心得:裝飾模式像是一種特化版的代理模式,代理模式只會包一層,裝飾模式會包多層。
package com.ssc24.chap15.demo01; public interface GameDisplay { void display(); }
package com.ssc24.chap15.demo01; public class ProxyGameDisplay implements GameDisplay { private RealGameDisplay realGameDisplay; public ProxyGameDisplay(RealGameDisplay realGameDisplay) { this.realGameDisplay = realGameDisplay; } public void display() { System.out.println("遊戲讀取中..."); this.realGameDisplay.display(); } }
package com.ssc24.chap15.demo01; public class RealGameDisplay implements GameDisplay { public void display() { System.out.println("顯示遊戲畫面"); } }
package com.ssc24.chap15.demo01; import static org.junit.Assert.*; import org.junit.Test; public class GameLoaderTest { @Test public void test() { System.out.println("===代理模式(動態代理)測試==="); System.out.println("---沒有使用代理---"); new RealGameDisplay().display(); System.out.println(); System.out.println("---使用代理---"); new ProxyGameDisplay(new RealGameDisplay()).display(); } }
/** ===代理模式(動態代理)測試=== ---沒有使用代理--- 顯示遊戲畫面 ---使用代理--- 遊戲讀取中... 顯示遊戲畫面 **/
package com.ssc24.chap15.demo02; public interface Person { void setLiteCount(int like); int getLikeCount(); String getName(); void setName(String name); }
package com.ssc24.chap15.demo02; public class PerSonBean implements Person { private String name; private int likeCount; @Override public void setLiteCount(int like) { this.likeCount = like; } @Override public int getLikeCount() { return this.likeCount; } @Override public String getName() { return this.name; } @Override public void setName(String name) { this.name = name; } }
package com.ssc24.chap15.demo02; public class ProxyPersonBean implements Person { PerSonBean person; private String name; private int likeCount; public ProxyPersonBean(PerSonBean person) { this.person = person; } @Override public void setLiteCount(int like) { System.out.println("無權限修改like數"); } @Override public int getLikeCount() { return this.person.getLikeCount(); } @Override public String getName() { return this.person.getName(); } @Override public void setName(String name) { this.person.setName(name); } }
package com.ssc24.chap15.demo02; import static org.junit.Assert.*; import org.junit.Test; public class PersonTest { @Test public void test() { System.out.println("===代理模式(保護代理)測試"); System.out.println("---沒使用代理---"); Person realPerson = new PerSonBean(); realPerson.setLiteCount(10); System.out.println("like " + realPerson.getLikeCount()); System.out.println("---使用代理---"); Person proxyPerson = new ProxyPersonBean(new PerSonBean()); proxyPerson.setLiteCount(11); System.out.println("like " + proxyPerson.getLikeCount()); } }
/** ===代理模式(保護代理)測試 ---沒使用代理--- like 10 ---使用代理--- 無權限修改like數 like 0 **/
package com.ssc24.chap15.demo03; public class FightManager { public void doFight(String userName) { System.out.println(userName + "帶領冒險者們與無辜的怪物戰鬥"); System.out.println("...以下省略戰鬥過程"); System.out.println(userName + "帶領冒險者們洗劫了怪物的家,結束了一場慘無妖道的屠殺"); } }
package com.ssc24.chap15.demo03; import java.util.Date; public class ProxyFightManager extends FightManager { private FightManager source; public ProxyFightManager(FightManager source) { this.source = source; } public void doFight(String userName) { System.out.println("> 開始時間:" + new Date().toLocaleString()); this.source.doFight(userName); } }
package com.ssc24.chap15.demo03; import static org.junit.Assert.*; import org.junit.Test; public class AOPTest { @Test public void test() { System.out.println("===代理模式(AOP)測試==="); System.out.println("---沒有使用代理---"); FightManager fm = new FightManager(); fm.doFight("煞氣A阿龐"); System.out.println(); System.out.println("---使用代理---"); FightManager proxyFm = new ProxyFightManager(fm); proxyFm.doFight("煞氣A阿龐"); } }
/** ===代理模式(AOP)測試=== ---沒有使用代理--- 煞氣A阿龐帶領冒險者們與無辜的怪物戰鬥 ...以下省略戰鬥過程 煞氣A阿龐帶領冒險者們洗劫了怪物的家,結束了一場慘無妖道的屠殺 ---使用代理--- > 開始時間:2017/12/25 下午 03:44:26 煞氣A阿龐帶領冒險者們與無辜的怪物戰鬥 ...以下省略戰鬥過程 煞氣A阿龐帶領冒險者們洗劫了怪物的家,結束了一場慘無妖道的屠殺 **/