双色球机选

前端时间发表了一片上色球有关的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<capacity;
	}
	
	/**
	 * 覆写toString方法
	 */
	public String toString(){
		StringBuffer sb = new StringBuffer();
		for(int i=0;i<index;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<capacity;i++){
			add();
		}
	}
	
	/**
	 * 添加一个元素到ball中,如果当前生成的随机数已经在数组中存在,
	 * 则重新生成号码,添加到此位置
	 */
	protected void add(){
		String number = getNumber();
		if(!ensureCapacity()){
			throw new RuntimeException("can't add more number");
		}
		for(int i=0;i<index;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<capacity;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<capacity;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();
		}
	}
}


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

你可能感兴趣的:(双色球机选)