package Day03;
import java.util.*;
public class StrategyPattern {
public static void main(String[] args) {
Context c = new Context(); // 建立環境
Strategy paper = new Paper(); // 建立剪刀石頭布
Strategy scissors = new Scissors();
Strategy stone = new Stone();
Type[] arr = {Type.PAPER, Type.SCISSORS, Type.STONE};
Scanner scanner = new Scanner(System.in);
System.out.println("剪刀石頭布!!!");
Random ran = new Random();
while(true){
int num = ran.nextInt(3)+1;
System.out.println("請出拳(1:剪刀;2:石頭;3:布):");
int input = scanner.nextInt();
switch(input){ // 根據輸入不同的數字選擇不同策略
case 1:
c.setStrategy(scissors);
break;
case 2:
c.setStrategy(stone);
break;
case 3:
c.setStrategy(paper);
break;
}
c.strategyMethod(arr[num - 1]);
System.out.println("-----------------");
}
}
}
enum Type { // 建立一個列舉方便等等程式使用
PAPER, SCISSORS, STONE
}
//抽象策略类
interface Strategy {
public void strategyMethod(Type type); //策略方法
}
//實體策略:布
class Paper implements Strategy {
public void strategyMethod(Type type) {
switch(type){
case PAPER:
System.out.println("敵人出布,我出布 => 平手");
break;
case SCISSORS:
System.out.println("敵人出剪刀,我出布 => 輸");
break;
case STONE:
System.out.println("敵人出石頭,我出布 => 贏");
break;
}
}
}
//實體策略:剪刀
class Scissors implements Strategy {
public void strategyMethod(Type type) {
switch(type){
case PAPER:
System.out.println("敵人出布,我出剪刀 => 贏");
break;
case SCISSORS:
System.out.println("敵人出剪刀,我出剪刀 => 平手");
break;
case STONE:
System.out.println("敵人出石頭,我出剪刀 => 輸");
break;
}
}
}
//實體策略:石頭
class Stone implements Strategy {
public void strategyMethod(Type type) {
switch(type){
case PAPER:
System.out.println("敵人出布,我出石頭 => 輸");
break;
case SCISSORS:
System.out.println("敵人出剪刀,我出石頭 => 贏");
break;
case STONE:
System.out.println("敵人出石頭,我出石頭 => 平手");
break;
}
}
}
//環境
class Context {
private Strategy strategy;
public Strategy getStrategy() {
return strategy;
}
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
public void strategyMethod(Type type) {
strategy.strategyMethod(type);
}
}