2019年5月13日 星期一

7天學會設計模式 CHAP21 原型模式 Prototype

7天學會設計模式
http://www.books.com.tw/products/0010750585

chap21.
原型模式 Prototype
目的:複製一個物件而不是重新創建一個
package com.ssc24.chap21.demo01;
public class AdventurExperience implements Cloneable {
 private String date;
 private String location;
 protected Object clone() throws CloneNotSupportedException {
  return super.clone();
 }
 public String getDate() {
  return date;
 }
 public void setDate(String date) {
  this.date = date;
 }
 public String getLocation() {
  return location;
 }
 public void setLocation(String location) {
  this.location = location;
 }
}

package com.ssc24.chap21.demo01;
public class Resume implements Cloneable {
 private String name;
 private int level;
 private String profession;
 private AdventurExperience experience;
 public Resume(String name,String profession,int level) {
  this.name = name;
  this.profession = profession;
  this.level = level;
  this.experience = new AdventurExperience();
 }
 private Resume (AdventurExperience experience) throws CloneNotSupportedException {
  this.experience = (AdventurExperience) experience.clone();
 }
 public  Object clone() throws CloneNotSupportedException {
  Resume clone = new Resume(experience);
  clone.setName(this.name);
  clone.setLevel(this.level);
  clone.setProfession(this.profession);
  return clone;
 }
 public void display() {
  System.out.printf(" 冒險者:%s-%s 等級:%d \n",name,profession,level);
  System.out.printf(" 冒險經歷:%s %s \n",experience.getDate(),experience.getLocation());
  System.out.println();
 }
 public void setExperience(String date,String location) {
  experience.setDate(date);
  experience.setLocation(location);
 }
 public void setName(String name) {
  this.name = name;
 }
 public void setLevel(int level) {
  this.level = level;
 }
 public void setProfession(String profession) {
  this.profession = profession;
 }
 public void setExperience(AdventurExperience experience) {
  this.experience = experience;
 }
}

package com.ssc24.chap21.demo01;
import static org.junit.Assert.*;
import org.junit.Test;
public class ResumeTest {
 @Test
 public void test() throws CloneNotSupportedException {
  System.out.println("===原型模式測試====");
  Resume resume = new Resume("傑克", "見習道士", 1);
  resume.setExperience("2011/01/01", "仙靈島");
  Resume resume2 = (Resume) resume.clone();
  resume2.setLevel(5);
  resume2.setExperience("20/12/03/31","隱龍窟");
  Resume resume3 = (Resume) resume2.clone();
  resume3.setProfession("殭屍道長");
  resume3.setExperience("2012/11/31", "赤鬼王血池");
  System.out.println("---第一份履歷---");
  resume.display();
  System.out.println("---第二份履歷---");
  resume2.display();
  System.out.println("---第三份履歷---");
  resume3.display();
 }
}

/**
===原型模式測試====
---第一份履歷---
 冒險者:傑克-見習道士 等級:1 
 冒險經歷:2011/01/01 仙靈島 

---第二份履歷---
 冒險者:傑克-見習道士 等級:5 
 冒險經歷:20/12/03/31 隱龍窟 

---第三份履歷---
 冒險者:傑克-殭屍道長 等級:5 
 冒險經歷:2012/11/31 赤鬼王血池 

**/