作者qrtt1 (愚人)
看板java
标题Re: [问题] 字串比较的问题
时间Sun Feb 18 01:52:27 2007
※ 引述《TonyQ (骨头)》之铭言:
: 有个用空间换取时间的方法,
: 用String 作hash建表。
: 再直接对HASH後的内容处理:P
: 这个问题让我想到State Pattern
: 不过要用在指令判定上 这可能不太适用..;p
用 Hash 是个好方法 :P
============================================================
// 建立一个命令的范本,用 toString 直接传回命令的名称
public abstract class AbstractCommand extends Object{
public void execute() {
}
// 懒得用 HashMap,只好改写 toString 配合 HashSet
public String toString(){
StringBuffer buf = new StringBuffer();
buf.append(super.toString());
return buf.substring(0, buf.indexOf("@"));
}
}
============================================================
// 写下你的命令要做些什麽
public class GetPizzaCommand extends AbstractCommand{
public void execute() {
System.out.println("Pizza ! Pizza!");
}
}
public class LookUpCommand extends AbstractCommand{
public void execute() {
System.out.println("Look it up");
}
}
============================================================
// 写个 invoker
// 所有的 command instance 要加在 hash set 之内
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class Invoker {
Set s;
public Invoker(HashSet s) {
this.s = s;
}
public void doIt(String cmd) {
for (Iterator it = s.iterator(); it.hasNext();) {
final AbstractCommand c = (AbstractCommand) it.next();
if (c.toString().equals(cmd)) {
c.execute();
break;
}
}
}
}
============================================================
// 主菜在这里
import java.util.HashSet;
public class JustDoIt {
public static void main(String[] args) {
HashSet commandSet = new HashSet();
commandSet.add(new LookUpCommand());
commandSet.add(new GetPizzaCommand());
// add many commands you wanted
Invoker e = new Invoker(commandSet);
e.doIt("LookUpCommand");
e.doIt("No Such Command");
}
}
============================================================
有点麻烦的 switch case 不见了
会是仿造 Command Pattern 的设计,
因为想了一下如果用 Hash 要自己维护 Key 会有一点麻烦
多打字就增加打错的机会,索性修改了 Command 的 toString
再弄个 Invoker 去执行我们的 command
即使没有找到 command 或没有这个 command 也不会有什麽错误而终止
会这样设计的理由是,由您的语意来看
我感觉不到命令是前後相关的,所以没有打算做 stateful 的设计
(DFA, state pattern ...if-goto etc.)
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.224.173.253