论坛首页 Java企业应用论坛

状态模式 疑惑

浏览 3091 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间: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());
	}
  • 描述: UML图
  • 大小: 7.8 KB
   发表时间:2008-03-13  
直接用策略模式不就行了,干嘛要用状态模式,并且状态模式里每个状态都知道它的下个状态如何转换,你的各个状态好像没什么关系,没必要用状态模式。
0 请登录后投票
   发表时间:2008-03-14  
hrtc 写道
直接用策略模式不就行了,干嘛要用状态模式,并且状态模式里每个状态都知道它的下个状态如何转换,你的各个状态好像没什么关系,没必要用状态模式。


确实应该用“策略模式”,但是“策略模式”里也没有定义“选择具体策略”的角色,看来if/else的判断是在所难免了。维护这样的if/else总觉得欠妥。而且客户端也必须知道所有的具体策略,然后进行选取。
0 请登录后投票
   发表时间:2008-03-14  
那个应该必须要写的,你那段代码相当于使用者,使用者必须自己知道要用什么策略,策略模式封装了策略的具体实现,并可以灵活的添加策略,使用者无需知道内部算法只要知道要什么算法就行了,这才是策略模式的用意。
0 请登录后投票
   发表时间:2008-03-14  
恕我眼拙,我怎么看得象工厂模式?
0 请登录后投票
   发表时间:2008-03-14  
实现差不多用意不一样,工厂是创建型模式,策略是行为型模式,在运行时选择应用的策略。
0 请登录后投票
论坛首页 Java企业应用版

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