[说明] 任何一种程序都是为了解决问题而撰写的,解决问题时需要实现一些特定的运算法则。在策略(Strategy)模式下,可以更换实现算法的部分而不留痕迹,切换整个算法,简化改为采用其他方法来解决同样问题。 以下是一个“剪刀石头布”游戏。猜拳时的“策略”有2种方法:第一种是“猜赢后继续出同样的招式”(WinningStrategy),第二种是“从上一次出的招式种,以概率分配方式求出下一个招式的几率”(ProbStrategy)。程序中定义了Hand类表示猜拳时的“手势”,类内部以0(石头)、1(剪刀)、2(布)来表示。Hand类的实例只会产生3个。 以下是Java语言实现,省略了不相关属性及方法,方法实现体亦有所省略,能够正确编译通过。 [Java代码] //Hand.java文件 public class Hand public static final int HANDVALUE_GUU = 0; //石头 public static final int HANDVALUE_CHO = 1; //剪刀 public static final int HANDVALUE_PAA = 2; //布 public static final Hand[] hand = new Hand(HANDVALUE_GUU), new Hand(HANDVALUE_CHO), new Hand(HANDVALUE_PAA), ; private int handvalue; (1) Hand(int handvalue) this.handvalue = handvalue;
public (2) Hand getHand(int handvalue)(//从值取得对象实例 return hand[handvalue];
//Strategy.java文件 public interface Strategy public (3) Hand nextHand();
//ProbStrategy.java文件 import java.util.Random; public class ProbStrategy implements Strategy public Hand nextHand() int handvalue = 0; /*省略具体实现*/ return Hand.getHand(handvalue);
//WinningStrategy.java文件 import java.util.Random; public class WinningStrategy implements Strategy /*省略了不相关属性*/ public Hand nextHand() if(!won) prevHand = Hand.getHand(random.nextInt(3));
return prevHand;
//Player.java文件 public class Player private String name; private Strategy strategy; public Player(String name, (4) strategy) this.name = name; this.strategy = strategy;