Re: [其他] 面试题目

楼主: adrianshum (Alien)   2014-11-29 11:40:49
老实说和 OOAD 扯不上什么关系吧.
回到问题上,可以大为简化成:
// 后面全部是 psuedo-code
for (i = 1 to 100) {
boolean handled = false
if (isMultipleOfThree(i)) {
print "B" // 你的 constant 老实说极无意义
handled = true;
}
if (isMultipleOfFive(i)) {
printf "F"
handled = true
}
if (!handled) {
print i
}
}
然后加入一些和 OOAD 有点关系的东西, 套用类似 Strategy 的 pattern:
interface ItemHandler { // 用 generics 更佳,这里简单写演示一下概念
// return true if handled, false if not
boolean handleItem(int i);
}
class PrintMultipleOfIntItemHandler implements ItemHandler {
int base;
String output;
public MultipleOfIntItemHandler(int base, String output) {
this.base = base;
this.output = output;
}
boolean handleItem(int i) {
if (i % base == 0) {
print output;
return true
}
return false
}
}
class SimplePrintItemHandler implements ItemHandler {
boolean handleItem(int i) {
print i
return true
}
}
你的 main loop 可以变成
// 这部份其实可以用不同方法达成,比如 config, DI etc
List<ItemHandler> handlers = [new PrintMultipleOfIntItemHandler(3,"B"),
new PrintMultipleOfIntItemHandler(5,"F")];
Handler defaultHandler = new SimplePrintItemHandler();
// 不必改动的 main loop
for (int i = 1 to 100) {
boolean handled = false
foreach (handler in handlers) {
result = handler.handleItem(i);
handled = handled || result;
}
if (!handled) {
defaultHandler.handleItem(i)
}
}
如果每个条件和处理是独立的话,这做法可以让你加入不同的
条件和处理方法时候,不需改动 main loop 的 logic
为了解决额外那个 defaultHandler,可以利用 chain-of-responsibility
pattern。
再进一步,如果你想连 item 的提供方法也可以替换,就弄一个
ItemProvider 的 interface 吧:
class ItemProvider {
// get next item. return null if no more item available
int nextItem();
}
这部份的实作留给你自己练习

Links booklink

Contact Us: admin [ a t ] ucptt.com