您的位置:首页 > 其它

关于石头剪刀布的模拟程序(二路分发)

2015-08-01 11:11 316 查看
二路分发(java 编程思想中这么说的)。

还是没有理解,我对这个设计的理解就是将本应该instanceof实现的功能替换成使用多态来实现。

下面是两个版本,第一个是我使用instanceof的实现,第二个是java编程思想中使用多态的实现。

公共的结果枚举:

package test2;
public enum Outcome {
WIN,LOSE,DRAW
}


我的实现(使用instanceof):

package test2;
import static test2.Outcome.DRAW;
import static test2.Outcome.LOSE;
import static test2.Outcome.WIN;

import java.util.Random;
/**
*
* 我自己的石头剪刀布实现
*
*/
interface MyItem {
Outcome compete(MyItem m ) ;
}
class MyPaper implements MyItem {
@Override
public Outcome compete(MyItem m) {
if(m instanceof MyPaper ){
return DRAW ;
}
if(m instanceof MyScissors ){
return LOSE ;
}
if(m instanceof MyRock ){
return WIN ;
}
return DRAW ;
}
@Override
public String toString() {
return "Paper" ;
}
}
class MyScissors implements MyItem {
@Override
public Outcome compete(MyItem m) {
if(m instanceof MyPaper ){
return WIN ;
}
if(m instanceof MyScissors ){
return DRAW ;
}
if(m instanceof MyRock ){
return LOSE ;
}
return DRAW ;
}
@Override
public String toString() {
return "Scissors" ;
}
}
class MyRock implements MyItem {
@Override
public Outcome compete(MyItem m) {
if(m instanceof MyPaper ){
return LOSE ;
}
if(m instanceof MyScissors ){
return WIN ;
}
if(m instanceof MyRock ){
return DRAW ;
}
return DRAW ;
}
@Override
public String toString() {
return "Rock" ;
}
}
public class MyRoShamBo {
private static Random random = new Random(47) ;
/**
* 随机产生输出
* @return 输出对象
*/
public static MyItem randomItem(){
int item = random.nextInt(3) ;
switch(item){
case 0 :
return new MyPaper() ;
case 1 :
return new MyScissors() ;
case 2 :
return new MyRock() ;
default :
throw new RuntimeException("随机产生出现异常 !") ;
}
}
public static void main(String[] args) {
for(int i = 0 ; i < 10 ; i ++){
MyItem one = randomItem() ;
MyItem two = randomItem() ;
System.out.println(one + " : "  + two + " " + one.compete(two));
}
}
}


多态的实现:

package test2;
import static test2.Outcome.* ;

import java.util.Random;
interface Item {
Outcome compete(Item i ) ;
/**
* 将当前对象与Paper进行比较
* @param p Paper对象
* @return 比较结果
*/
Outcome eval(Paper p ) ;
Outcome eval(Scissors s ) ;
Outcome eval(Rock r ) ;
}
class Paper implements Item {
@Override
public Outcome compete(Item i) {
/**
* 现在考虑调用时的情形:
* Item a = new Paper() ;
* Item b = new Paper() ;
* a.compete(b) ;
* 当在a中执行complete方法时,this的类型已经确定,不是Item接口类型,而是具体实现类类型。
* 但是传递进来的b已经被向上转型为Item类型,所以在使用this.eval(b)时会出现参数类型不匹配的问题。
* 当使用b.eval(this)时就可以了,这时b通过多态的机制调用了适用于this的重载的eval方法。
* java编程思想上说的是:
* 将自身(this)作为参数调用eval(),能够调用重载过的eval()方法,这能够保留第一次分发的类型信息。
*/
return i.eval(this) ;
//The method eval(Paper) in the type Paper is not applicable for the arguments (Item)
//this.eval(i) ;
}
@Override
public Outcome eval(Paper p) {
return DRAW ;
}
@Override
public Outcome eval(Rock r) {
return WIN ;
}
@Override
public Outcome eval(Scissors s) {
return LOSE ;
}
}
class Scissors implements Item {
@Override
public Outcome compete(Item i) {
return i.eval(this) ;
}
@Override
public Outcome eval(Paper p) {
return WIN ;
}
@Override
public Outcome eval(Rock r) {
return LOSE ;
}
@Override
public Outcome eval(Scissors s) {
return DRAW ;
}
}
class Rock implements Item {
@Override
public Outcome compete(Item i) {
return i.eval(this) ;
}
@Override
public Outcome eval(Paper p) {
return LOSE ;
}
@Override
public Outcome eval(Rock r) {
return DRAW ;
}
@Override
public Outcome eval(Scissors s) {
return WIN ;
}
}
public class RoShamBo {
private static Random random = new Random(47) ;
/**
* 随机产生输出
* @return 输出对象
*/
public static MyItem randomItem(){
int item = random.nextInt(3) ;
switch(item){
case 0 :
return new MyPaper() ;
case 1 :
return new MyScissors() ;
case 2 :
return new MyRock() ;
default :
throw new RuntimeException("随机产生出现异常 !") ;
}
}
public static void main(String[] args) {
for(int i = 0 ; i < 10 ; i ++){
MyItem one = randomItem() ;
MyItem two = randomItem() ;
System.out.println(one + " : "  + two + " " + one.compete(two));
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: