2019年5月13日 星期一

7天學會設計模式 CHAP25 拜訪者模式 Visitor

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

chap25.
拜訪者模式 Visitor
目的:用不同的拜訪者使集合(Collection)中的元素行為與元素類別切離。
package com.ssc24.chap25.demo01;
public abstract class Chef {
 private String name;
 public Chef(String name) {
  this.name = name;
 }
 public String getName() {
  return name;
 }
 public abstract void acept(Visitor visitor); 
}

package com.ssc24.chap25.demo01;
public class DarkChef extends Chef {
 public DarkChef(String name) {
  super(name);
 }
 @Override
 public void acept(Visitor visitor) {
  visitor.cook(this);
 }
}

package com.ssc24.chap25.demo01;
public class SuperChef extends Chef {
 public SuperChef(String name) {
  super(name);
 }
 @Override
 public void acept(Visitor visitor) {
  visitor.cook(this);
 }
}

package com.ssc24.chap25.demo01;
public class SuperNoodleChef extends Chef {
 public SuperNoodleChef(String name) {
  super(name);
 }
 @Override
 public void acept(Visitor visitor) {
  visitor.cook(this);
 }
}

package com.ssc24.chap25.demo01;
public interface Visitor {
 void cook(DarkChef chef);
 void cook(SuperChef  chef);
 void cook(SuperNoodleChef chef);
}

package com.ssc24.chap25.demo01;
public class Visitor_saoMai implements Visitor {
 @Override
 public void cook(DarkChef chef) {
  System.out.println(chef.getName() + ":魔幻鴉片燒賣");
  
 }
 @Override
 public void cook(SuperChef chef) {
  System.out.println(chef.getName() + ":宇宙大燒賣");
  
 }
 @Override
 public void cook(SuperNoodleChef chef) {
  System.out.println(chef.getName() + ":鐵桿50人份燒賣");
 }
}

package com.ssc24.chap25.demo01;
public class Visitor_tofu implements Visitor {
 @Override
 public void cook(DarkChef chef) {
  System.out.println(chef.getName() + ":豆腐三重奏");
 }
 @Override
 public void cook(SuperChef chef) {
  System.out.println(chef.getName() + ":貓熊豆腐");
 }
 @Override
 public void cook(SuperNoodleChef chef) {
  System.out.println(chef.getName() + ":鐵桿臭豆腐");
 }
}

package com.ssc24.chap25.demo01;
import java.util.ArrayList;
import java.util.List;
public class ChefGroup {
 private List<Chef> list = new ArrayList<>();
 public void join (Chef chef) {
  list.add(chef);
 }
 public void leave (Chef chef) {
  list.remove(chef);
 }
 public void topic (Visitor visitor) {
  for (Chef chef : list) {
   chef.acept(visitor);
  }
 }
}

package com.ssc24.chap25.demo01;
import static org.junit.Assert.*;
import org.junit.Test;
public class ChefTest {
 @Test
 public void test() {
  System.out.println("===拜訪者模式測試===");
  ChefGroup chefGroup = new ChefGroup();
  chefGroup.join(new SuperChef("小當家"));
  chefGroup.join(new DarkChef("紹安"));
  chefGroup.join(new SuperNoodleChef("解師傅"));
  System.out.println("第一回合:做燒賣");
  Visitor round1 = new Visitor_saoMai();
  chefGroup.topic(round1);
  System.out.println("第二回合:豆腐");
  Visitor round2 = new Visitor_tofu();
  chefGroup.topic(round2);
 }
}

/**
===拜訪者模式測試===
第一回合:做燒賣
小當家:宇宙大燒賣
紹安:魔幻鴉片燒賣
解師傅:鐵桿50人份燒賣
第二回合:豆腐
小當家:貓熊豆腐
紹安:豆腐三重奏
解師傅:鐵桿臭豆腐
**/