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阿龐帶領冒險者們洗劫了怪物的家,結束了一場慘無妖道的屠殺 **/