论坛首页 Java企业应用论坛

学习设计模式之State

浏览 12866 次
精华帖 (1) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-09-06  
写的很好,现在在学设计模式,很有帮助
0 请登录后投票
   发表时间: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
0 请登录后投票
   发表时间:2008-09-08  
分支分化成类,类就太多了
0 请登录后投票
   发表时间:2008-09-08  
不一定是为了使用设计模式而去改变代码,
分支细了有时候可能导致类爆炸

不过写的不错
0 请登录后投票
   发表时间:2008-09-08  
lz写得很不错啊,我感觉和《headfirst 设计模式》中的第一个例子有点相似,只是这个设计模式好像并不是为了用来解决 if{}else{}的。才刚刚看《headfirst 设计模式》,也不知道对不对 呵呵
0 请登录后投票
   发表时间:2008-09-08  
linpyi 写道
不一定是为了使用设计模式而去改变代码,
分支细了有时候可能导致类爆炸

不过写的不错


以前讨论过。如果不在乎那点性能,可以考虑使用InnerClass来解决类爆炸的问题。同时也比较容易规范一些。
0 请登录后投票
   发表时间:2008-09-14  
可以打个比方,一个计算器上面有很多个按钮,没个按钮其实就对应一个state,这样每当user按下某个按钮的时候其实已经提交了需要执行的某种state了,然后计算器会根据这个state调用适当的handler来处理请求了。
0 请登录后投票
   发表时间:2008-10-15  
看了这个例子,主要的感觉是很麻烦。还是if else 省事。
这个没什么特别要求还是别用了,一堆代码还不好懂。另外那个修改过的版本是比较好的,比较实用的例子
0 请登录后投票
   发表时间:2008-10-16  
lz的方法需要往context写注入hander方法,那就需要改变原来实例属性、
一般不会这么做吧。
如果加入工厂模式来实现比较合理一点。
假设有个Factroy 提供根据state 返回hander类
那么
StateHandler   hander = Factroy.getHandler(context.getState());
hander.handle(context);
0 请登录后投票
   发表时间:2008-10-23  
maxima 写道
lz的方法需要往context写注入hander方法,那就需要改变原来实例属性、
一般不会这么做吧。
如果加入工厂模式来实现比较合理一点。
假设有个Factroy 提供根据state 返回hander类
那么
StateHandler   hander = Factroy.getHandler(context.getState());
hander.handle(context);


实际中,这种用法比较多~

运用state模式可能类更多了,代码也多了,但是程序的维护性和扩展性会更好,特别是在业务越来越复杂的情况下,优势更明显~
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics