今天听了一天的课, 对老师讲的软件设计有了一定的了解。
开发的代码不变, 而需求却在一直变化,如何在软件设计初期就考虑包含这些变化, 或者重构代码为以后的扩展提供更多的便利。
切入点从一个例子开始,
1> 将 Class A 与 Class B 交互, 将“ABC”转化为小写方式的"abc".
这里我们或许写一个简单的方法就可以实现了。
2> 需求增加, 我们要将"abc" 转化成 "ABC".
我们或许在上面的方法里面加个else.
3> 需求继续增加, 我们要将字符串反转。
我们再增加一个方法? 还是在现有方法基础上做修改。
4> 需求继续增加, 我们要将传入的数字输出。
在现有的基础上我们再增加if&else 分支么?
这时候, 我们为了消除程序的分支复杂度, 引入了Command模式。
这里我们将每种需求做成一种Command的实现, 在需求增加的情况下, 只需要增加新的实现代码即可以实现。
public class CatalogApp {
public static final String REVERSE_HANDLER = "reverse";
public static final String UPPERCASE_HANDLER = "uppercase";
private Map<String, Handler> handlers;
public CatalogApp() {
createHandlers();
}
public void createHandlers() {
handlers = new HashMap<String, Handler>();
handlers.put(REVERSE_HANDLER, new ReverseHandler(this));
handlers.put(UPPERCASE_HANDLER, new UpperCaseHandler(this));
}
public HandlerResponse executeActionAndGetResponse(String handlerName, Map parameters) {
Handler handler = lookupHandlerBy(handlerName);
return handler.execute(parameters);
}
private Handler lookupHandlerBy(String handlerName){
return handlers.get(handlerName);
}
}
public class LowerCaseHandler extends Handler {
public LowerCaseHandler(CatalogApp catalogApp) {
super(catalogApp);
}
public HandlerResponse execute(Map parameters) {
return null;
}
}