2008-03-13

状态模式 疑惑

关键字: 状态模式
有这样的一个关于“处理策略”需求:

=== 需求 ===
1. 处理策略有若干种类型,比如说,按人员,按部门等。

2. 处理策略需要有一个方法就是判断当前的用户是否符合处理策略:
   * 如果处理策略是按人员,当前用户是否是该人员
   * 如果处理策略是按部门,当前用户是否是属于该部门

3. 对应不同的处理策略类型,判断当前的用户是否符合处理策略有不同的逻辑

=== 设计 ===

自己准备用状态(或策略)模式来做, 请看UML类图。


在做的时候,遇到一个问题:对于“选择具体状态类的角色”这部分逻辑,我把它放在了AssignRule里。 这部分逻辑出现很多的if/else代码,不知道如何修改?
	/**
	 * initialize State instance, according to type of rule
	 * @param rule
	 */
	private void initState(Rule rule) {
		String type = rule.getType();
		//FIXME: how to eliminate if else 
		if ("1".equals(type))
			setState(new PersonState());
		else 
			setState(new DepartmentState());
	}
  • 420643fe-ea85-3564-8bec-67ba8a9a2f03-thumb
  • 描述: UML图
  • 大小: 7.8 KB
评论
hrtc 2008-03-14   回复
实现差不多用意不一样,工厂是创建型模式,策略是行为型模式,在运行时选择应用的策略。
nighthawk 2008-03-14   回复
恕我眼拙,我怎么看得象工厂模式?
hrtc 2008-03-14   回复
那个应该必须要写的,你那段代码相当于使用者,使用者必须自己知道要用什么策略,策略模式封装了策略的具体实现,并可以灵活的添加策略,使用者无需知道内部算法只要知道要什么算法就行了,这才是策略模式的用意。
ian jiang 2008-03-14   回复
hrtc 写道
直接用策略模式不就行了,干嘛要用状态模式,并且状态模式里每个状态都知道它的下个状态如何转换,你的各个状态好像没什么关系,没必要用状态模式。


确实应该用“策略模式”,但是“策略模式”里也没有定义“选择具体策略”的角色,看来if/else的判断是在所难免了。维护这样的if/else总觉得欠妥。而且客户端也必须知道所有的具体策略,然后进行选取。
hrtc 2008-03-13   回复
直接用策略模式不就行了,干嘛要用状态模式,并且状态模式里每个状态都知道它的下个状态如何转换,你的各个状态好像没什么关系,没必要用状态模式。
发表评论

提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则

您还没有登录,请登录后发表评论

ian jiang
搜索本博客
博客分类
我的相册
803e70c7-f42d-386c-ad20-a94046fcc1ff-thumb
我们吃饭的地方.jpg
共 1 张
最近加入圈子
存档
最新评论