锁定老帖子 主题:学习设计模式之State
精华帖 (1) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-09-06
写的很好,现在在学设计模式,很有帮助
|
|
返回顶楼 | |
发表时间:2008-09-06
建议你去看一下《重构》。
当代码里有多处if else语句的时候。 1:找到动态嵌入点。用state模式或Strategy模式,state通常情况下是无法用的,一般都是用Strategy模式。 2:如果没有动态切入点。如你的ContextOriginal。那就要把if else语句抽取出来放到的一个方法里,而且这个方法除if else没有其他的代码。然后在不同的地方通用它。 3:下面是我重构的代码。我这样修改了对现在没有多大意义,因为你excute()里没有其他业务代码。通常情况是还有其他业务代码的。但是可扩展性增强了 public class ContextOriginal { private String state; public String getState() { return state; } public void setState(String state) { this.state = state; } public void print(String msg) { System.out.println(msg); } public void printImplFirst() { this.print("printImplFirst: " + this.state); } public void printImplSecond() { this.print("printImplSecond: " + this.state); } public void printImplThird() { this.print("printImplFinal: " + this.state); } public void execute() { printImpl(this.state); } public void printImpl(String state) { if (state == null) { throw new NullPointerException("this.state is null"); } else if (this.state.equals("first")) { this.printImplFirst(); } else if (this.state.equals("second")) { this.printImplSecond(); } else if (this.state.equals("third")) { this.printImplThird(); } else { throw new IllegalArgumentException("illegalArgumentException: this.state = " + this.state); } } } 在coding的时候。不要刻意想着一定要吧某种设计模式给用上。 “设计模式知识OO设计上一部分内容”这句话可能不完全准确。能理解就好 00设计原则 http://samuelray.iteye.com/blog/170463 |
|
返回顶楼 | |
发表时间:2008-09-08
分支分化成类,类就太多了
|
|
返回顶楼 | |
发表时间:2008-09-08
不一定是为了使用设计模式而去改变代码,
分支细了有时候可能导致类爆炸 不过写的不错 |
|
返回顶楼 | |
发表时间:2008-09-08
lz写得很不错啊,我感觉和《headfirst 设计模式》中的第一个例子有点相似,只是这个设计模式好像并不是为了用来解决 if{}else{}的。才刚刚看《headfirst 设计模式》,也不知道对不对 呵呵
|
|
返回顶楼 | |
发表时间:2008-09-08
linpyi 写道 不一定是为了使用设计模式而去改变代码,
分支细了有时候可能导致类爆炸 不过写的不错 以前讨论过。如果不在乎那点性能,可以考虑使用InnerClass来解决类爆炸的问题。同时也比较容易规范一些。 |
|
返回顶楼 | |
发表时间:2008-09-14
可以打个比方,一个计算器上面有很多个按钮,没个按钮其实就对应一个state,这样每当user按下某个按钮的时候其实已经提交了需要执行的某种state了,然后计算器会根据这个state调用适当的handler来处理请求了。
|
|
返回顶楼 | |
发表时间:2008-10-15
看了这个例子,主要的感觉是很麻烦。还是if else 省事。
这个没什么特别要求还是别用了,一堆代码还不好懂。另外那个修改过的版本是比较好的,比较实用的例子 |
|
返回顶楼 | |
发表时间:2008-10-16
lz的方法需要往context写注入hander方法,那就需要改变原来实例属性、
一般不会这么做吧。 如果加入工厂模式来实现比较合理一点。 假设有个Factroy 提供根据state 返回hander类 那么 StateHandler hander = Factroy.getHandler(context.getState()); hander.handle(context); |
|
返回顶楼 | |
发表时间:2008-10-23
maxima 写道 lz的方法需要往context写注入hander方法,那就需要改变原来实例属性、
一般不会这么做吧。 如果加入工厂模式来实现比较合理一点。 假设有个Factroy 提供根据state 返回hander类 那么 StateHandler hander = Factroy.getHandler(context.getState()); hander.handle(context); 实际中,这种用法比较多~ 运用state模式可能类更多了,代码也多了,但是程序的维护性和扩展性会更好,特别是在业务越来越复杂的情况下,优势更明显~ |
|
返回顶楼 | |