双色球机选

前端时间发表了一片上色球有关的java小程序:http://color4you.iteye.com/admin/blogs/259442

今天来博客发现大家发表了一些意见,自己也重新研究了一下这个小程序,其实大家说得很好,这个程序更像是面向过程语言。于是想到了对这个程序进行重构,因为今天是星期天,本来就无聊嘛。

添加了一个Ball类,用于构建红色球和蓝色球的共同特征:

package com.color.program.ball;

import java.util.Arrays;

public abstract class Ball {

protected String[] ball;
protected int capacity;
protected int index;

/**
* 构造一个指定大小的ball
* @param capacity
*/
public Ball(int capacity){
this.capacity = capacity;
this.ball = new String[capacity];
}

/**
* 取得一个随机的字符串
* @return
*/
protected abstract String getNumber();

/**
* 返回当前的ball中元素数量
* @return
*/
protected int size(){
return this.index;
}

/**
* 确定能添加的数据没有越界
* @return
*/
protected boolean ensureCapacity(){
return index }

/**
* 覆写toString方法
*/
public String toString(){
StringBuffer sb = new StringBuffer();
for(int i=0;i sb.append(ball[i]+"\t");
}
return sb.toString();
}

/**
* 为ball中已经添加的元素排序
*/
protected void sort(){
Arrays.sort(ball,0,index);
}

/**
* 根据指定的大小,完成数据的添加
*/
public void generate(){
for(int i=0;i add();
}
}

/**
* 添加一个元素到ball中,如果当前生成的随机数已经在数组中存在,
* 则重新生成号码,添加到此位置
*/
protected void add(){
String number = getNumber();
if(!ensureCapacity()){
throw new RuntimeException("can't add more number");
}
for(int i=0;i if(number.equals(ball[i])){
add();
return;
}
}
ball[index++] = number;
}
}



然后是红色球:

package com.color.program.ball;

public class RedBall extends Ball{

/**
* 创建指定大小的红色球
* @param capacity
*/
public RedBall(int capacity){
super(capacity);
}

/**
* 默认为6个红色球
*/
public RedBall(){
this(6);
}

/**
* 取得一个1--33之间的随机数,如果数字小于10,在数字前补加0,
* 保证为两位数
*/
@Override
protected String getNumber() {
int number = 1 + (int)Math.round(Math.random()*32);
return number <10 ?"0"+number:""+number;
}

public boolean equals(Object ob){
if(this == ob)
return true;
if(ob instanceof RedBall){
RedBall red = (RedBall)ob;
if(red.size() != this.size() || red.capacity != this.capacity)
return false;
this.sort();
red.sort();

for(int i=0;i if(this.ball[i].equals(red.ball[i])){
return false;
}
}
return true;
}
return false;
}

}


蓝色球:
package com.color.program.ball;

public class BlueBall extends Ball{

/**
* 创建指定大小的蓝色球
* @param capacity
*/
public BlueBall(int capacity){
super(capacity);
}

/**
* 默认只有一个蓝色球
*/
public BlueBall(){
this(1);
}

/**
* 取得一个1--16之间的随机数,如果小于10,则在前面补加一个0
* 保证是两位数
*/
@Override
protected String getNumber() {
int number = 1 + (int)Math.round(Math.random()*15);
return number<10?"0"+number:""+number;
}

public boolean equals(Object ob){
if(this == ob)
return true;
if(ob instanceof BlueBall){
BlueBall blue = (BlueBall)ob;
if(blue.size() != this.size() || blue.capacity != this.capacity)
return false;
this.sort();
blue.sort();

for(int i=0;i if(this.ball[i].equals(blue.ball[i])){
return false;
}
}
return true;
}
return false;
}
}


完整包含红色球和蓝色球的双色球:
package com.color.program.ball;

public class DoubleBall {

private Ball redBall;
private Ball blueBall;

public DoubleBall(int redSize,int blueSize){
this.redBall = new RedBall(redSize);
this.blueBall = new BlueBall(blueSize);
}

public DoubleBall(){
this.redBall = new RedBall();
this.blueBall = new BlueBall();
}

/**
* 产生一注完整号码,并完成排序
*/
public void generate(){
redBall.generate();
blueBall.generate();
redBall.sort();
blueBall.sort();
}

public void show(){
System.out.print(redBall);
System.out.println(blueBall);
}

public boolean equals(Object ob){
if(this == ob){
return true;
}
if(ob instanceof DoubleBall){
DoubleBall db = (DoubleBall)ob;
return (this.redBall.equals(db.redBall) && this.blueBall.equals(db.blueBall));
}
return false;
}
}


测试的主程序:
package com.color.program.ball;

public class DoubleMain {

public static void main(String[] args){
for(int i=0;i<5;i++){
DoubleBall doubleBall = new DoubleBall();
doubleBall.generate();
doubleBall.show();
}
}
}


希望大家指出我的不足之处,谢谢。

你可能感兴趣的:(java)