题目内容:
FizzBuzzWhizz
你是一名体育老师,在某次课距离下课还有五分钟时,你决定搞一个游戏。此时有100名学生在上课。游戏的规则是:
5.1节前,在部门内部安排大伙写了一下,很多童鞋子也写了,感觉用JAVA写出来的,没有比较理想的。后来就借这个题叫大伙坐一起,一起写了一下。代码都属临场发挥,没过多细想,应该还有很多重构空间,因为一来本来没有投简历意向,二来时间也不是很足够,所以,在此就不追求极致了。与大伙分享一下,重在思想,欢迎指正。
拿一个问题,我们首先分析问题的本质,本题的本质就是处理数字,OK.那我们就先定义一个接口:
public interface NumberHandler { String doHandler(Integer num); }
经过简单重构以后,提取出了一个DefaultHandler。代码如下:
public abstract class DefaultHandler implements NumberHandler { /**输入值*/ protected Integer value; /**输出单词*/ protected String word; public DefaultHandler(Integer value, String word) { this.value = value; this.word = word; } public abstract String doHandler(Integer num); }
public class MutipluHandler extends DefaultHandler{ public MutipluHandler(Integer value, String word) { super(value, word); } @Override public String doHandler(Integer num) { if(num % value==0){ return word; } return null; } }
public class ContainHandler extends DefaultHandler implements Dictatorial{ public ContainHandler(Integer value, String word) { super(value, word); } @Override public String doHandler(Integer num) { if(num.toString().contains(value.toString())){ return word; } return null; } }
/** * Created by Administrator on 2014/5/7. * 独断处理,标识接口 */ public interface Dictatorial { }
剩下要做的就是需要一个处理器链,来挨个调用处理逻辑:
public class FilterChain { private static LinkedList<NumberHandler> handlerList = new LinkedList<NumberHandler>(); public void addHandler(NumberHandler handler){ if(handler instanceof Dictatorial){ handlerList.addFirst(handler); }else{ handlerList.add(handler); } } public void doFilter(Integer num){ String result = ""; boolean flag = true; for(NumberHandler handler: handlerList){ //独断处理 if(!flag) break; String temp = handler.doHandler(num); if(temp != null){ result+= temp; if(handler instanceof Dictatorial){ flag = false; } } } System.out.println(result == "" ? num : result); } }
最后就是测试类:
public class TestRunner { public static void main(String[] args) { //create resource FilterChain chain = new FilterChain(); MutipluHandler h1 = new MutipluHandler(3,"Fizz"); MutipluHandler h2 = new MutipluHandler(5,"Buzz"); MutipluHandler h3 = new MutipluHandler(7,"Whizz"); ContainHandler h4 = new ContainHandler(3,"Fizz"); chain.addHandler(h4); chain.addHandler(h1); chain.addHandler(h2); chain.addHandler(h3); for(int i= 1; i<=100; i++){ chain.doFilter(i); } } }
其实在解决这个问题的时候,大致过程是这样:
1.定义接口
2.给出2个实现类,支持3,5,7
3.重构2个实现类,将3,5,7做到可以灵活配置。
4.定义FilterChain,先满足倍数处理
5.处理包含这种独占式处理器,定义标识接口,重构FilterChain