100 doors 编程操练 java版 dojo

http://www.cyber-dojo.org/这是一个编程操练网站,外国的,可能你还不知道,我推荐一下给你们,有助于你们提高编程实力,也可以使用《重构》、《设计模式》、《重构与模式》这些书里面介绍的一些技巧来设计,这个网站里面有很多编程题目,可以融合一下你所学习的编程技巧。

100 doors这是第一道编程题目,以下是我的编程实现,也是一个重构的过程,但是我只给出我的最终版代码,如果演化过来的,我会用语言阐述一下。

这是题目:

100 doors in a row are all initially closed. You make
100 passes by the doors. The first time through, you
visit every door and toggle the door (if the door is
closed, you open it; if it is open, you close it).
The second time you only visit every 2nd door (door
#2, #4, #6, ...). The third time, every 3rd door
(door #3, #6, #9, ...), etc, until you only visit
the 100th door.

Question: What state are the doors in after the last
pass? Which are open, which are closed?

经过思考分析,我提炼出了一个类,Door类,这个类有什么属性和行为呢,我觉得应该有门号,当前状态,前一个状态,因为要切换状态,开或闭,所以应该有两个状态属性来记录,我没有提炼一个状态类,我觉得暂时还没有必要重构到这个程度。

Door类内容如下:

//提炼类 门
public class Door {
	
	private int doorNo;			//门号
	private boolean preState;		//前一个状态  
	private boolean curState;		//当前状态
	
	public Door(int doorNo) {
		this.doorNo = doorNo;
	}
	
	//切换状态   
	public void toggle() {
		setPreState(getCurState());	   //前一个状态为当前状态
		setCurState(!(getCurState())); //切换toggle
	}
	
	@Override
	public String toString() {
		StringBuffer printContent = new StringBuffer();
		printContent.append("The ");
		printContent.append(doorNo);
		printContent.append(" door's state is ");
		printContent.append(getState());
		return printContent.toString();
	}

	//取得当前状态 状态:true:开 false:闭
	private String getState() {
		return this.curState == true ? "open" : "close";
	}

	public int getDoorNo() {
		return doorNo;
	}
	public void setDoorNo(int doorNo) {
		this.doorNo = doorNo;
	}
	public boolean getPreState() {
		return preState;
	}
	public void setPreState(boolean preState) {
		this.preState = preState;
	}
	public boolean getCurState() {
		return curState;
	}
	public void setCurState(boolean curState) {
		this.curState = curState;
	}
	
	
}
我还提炼了一个协助类handler,就是为了与客户端解耦合,降低一个耦合度,DoorHandler类如下:

import java.util.ArrayList;
import java.util.List;

//门的协助类
public class DoorHandler {

	//初始化
	public static List<Door> initDoors(int number) {
		List<Door> doorList = new ArrayList<Door>();
		for (int i = 0; i < number; i++) {
			Door door = new Door(i + 1);  //门号从1开始
			door.setCurState(false);	  //默认状态关闭
			doorList.add(door);
		}
		return doorList;
	}
	
	//闯关次数
	public static List<Door> pass(List<Door> doorList, int times) {
		for (int i = 0; i < times; i++) {
			for (Door door : doorList) {
				if (door.getDoorNo() % (i + 1) == 0) {
					door.toggle();
				}
			}
		}
		return doorList;
	}
	
	//打印门的状态
	public static void printDoorsState(List<Door> doorList) {
		for (Door door : doorList) {
			System.out.println(door.toString());
		}
	}
}
接下来自然就是测试了,Client类如下:

import java.util.List;

public class Client {
	
	/**
	 * 1.初始化100道门
	 * 2.闯关次数
	 * 3.打印门的状态
	 */
	public static void main(String[] args) {
		List<Door> doorList = DoorHandler.initDoors(100);
		DoorHandler.pass(doorList, 3);
		DoorHandler.printDoorsState(doorList);
	}

}

总结:DoorHandler类起到了很大作用,把业务逻辑从客户端隔离出来,独立的变化。分析一下现在的程序的拓展性,如果现在把100道门改为200或50,都很容易实现,因为只是初始化多少道门的问题,通过DoorHandler的initDoors的方法参数传递就行了。闯关的次数,也是很容易修改,都是参数改一下就行了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值