2019年5月13日 星期一

7天學會設計模式 CHAP15 代理模式 Proxy

7天學會設計模式
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阿龐帶領冒險者們洗劫了怪物的家,結束了一場慘無妖道的屠殺

**/