// patterns/PaperScissorsRock.java// (c)2017 MindView LLC: see Copyright.txt// We make no guarantees that this code is fit for any purpose.// Visit http://OnJava8.com for more book information.// Demonstration of multiple dispatchingimport java.util.*;import java.util.function.*;import java.util.stream.*;import onjava.*;import static onjava.Tuple.*;enum Outcome { WIN, LOSE, DRAW }interface Item {Outcome compete(Item it);Outcome eval(Paper p);Outcome eval(Scissors s);Outcome eval(Rock r);}class Paper implements Item {@Overridepublic Outcome compete(Item it) {return it.eval(this);}@Overridepublic Outcome eval(Paper p) {return Outcome.DRAW;}@Overridepublic Outcome eval(Scissors s) {return Outcome.WIN;}@Overridepublic Outcome eval(Rock r) {return Outcome.LOSE;}@Overridepublic String toString() { return "Paper"; }}class Scissors implements Item {@Overridepublic Outcome compete(Item it) {return it.eval(this);}@Overridepublic Outcome eval(Paper p) {return Outcome.LOSE;}@Overridepublic Outcome eval(Scissors s) {return Outcome.DRAW;}@Overridepublic Outcome eval(Rock r) {return Outcome.WIN;}@Overridepublic String toString() { return "Scissors"; }}class Rock implements Item {@Overridepublic Outcome compete(Item it) {return it.eval(this);}@Overridepublic Outcome eval(Paper p) {return Outcome.WIN;}@Overridepublic Outcome eval(Scissors s) {return Outcome.LOSE;}@Overridepublic Outcome eval(Rock r) {return Outcome.DRAW;}@Overridepublic String toString() { return "Rock"; }}class ItemFactory {static List<Supplier<Item>> items =Arrays.asList(Scissors::new, Paper::new, Rock::new);static final int SZ = items.size();private static SplittableRandom rand =new SplittableRandom(47);public static Item newItem() {return items.get(rand.nextInt(SZ)).get();}public static Tuple2<Item,Item> newPair() {return tuple(newItem(), newItem());}}class Compete {public static Outcome match(Tuple2<Item,Item> p) {System.out.print(p.a1 + " -> " + p.a2 + " : ");return p.a1.compete(p.a2);}}public class PaperScissorsRock {public static void main(String[] args) {Stream.generate(ItemFactory::newPair).limit(20).map(Compete::match).forEach(System.out::println);}}/* Output:Scissors -> Rock : LOSEScissors -> Paper : WINRock -> Paper : LOSERock -> Rock : DRAWRock -> Paper : LOSEPaper -> Scissors : LOSERock -> Paper : LOSEScissors -> Scissors : DRAWScissors -> Rock : LOSEScissors -> Paper : WINScissors -> Rock : LOSEPaper -> Scissors : LOSERock -> Rock : DRAWScissors -> Scissors : DRAWPaper -> Paper : DRAWScissors -> Paper : WINScissors -> Rock : LOSEScissors -> Paper : WINRock -> Paper : LOSERock -> Scissors : WIN*/
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。