浏览 3294 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-02-11
定义:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。 用途:主要解决当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化! 定义依然的让人迷惑不解!如果说,状态模式就是为了替换复杂的if...else语句的,是否会有点恍然大悟的感觉? 我现在对状态模式的理解是这样的,一个类里面有过于复杂的if...else,维护起来很不方便,如果哪里有问题了,要维护一大块代码,而如果有新的条件了,则需要修改这一大段的代码。状态模式就是为了解决这个问题的。 假设有如下一段代码。 public class Find { public void find(int id) { if (id == 1) { System.out.println("1"); } else if (id == 2) { System.out.println("2"); } else if (id == 3) { System.out.println("3"); } else if (id == 4) { System.out.println("4"); } } } 如果判断里面的业务比较麻烦的话,那么这段代码就很复杂了。而如果可能需求又变了,还要判断id == 5,又要找到这段代码来修改。 看看状态模式的写法,在这里,一个判断就是一个所谓的状态,符合这个状态就执行相应的动作,否则就进入下一个状态。可以想象,每个状态都有统一的接口。 public interface State { public void execute(Find find,int id); } 修改Find public class Find { private State state; public void setState(State state) { this.state = state; } public Find(State state) { this.state = state; } public void stateFind(int id) { state.execute(this, id); } } 再看State的子类怎么写。 public class State1 implements State{ public void execute(Find find,int id) { if(id == 1){ System.out.println("1"); }else{ find.setState(new State2()); find.stateFind(id); } } } public class State2 implements State { public void execute(Find find, int id) { if(id == 2){ System.out.println("2"); }else{ find.setState(new State3()); find.stateFind(id); } } } public class State3 implements State { public void execute(Find find, int id) { if(id == 3){ System.out.println("3"); }else{ find.setState(new State3()); find.stateFind(id); } } } 测试 public class FindTest { Find find; @Before public void init(){ find = new Find(new State1()); } @Test public void testFind() throws Exception { find.stateFind(3); } } 如果需要修改各个状态所对应的行为,到相应的类里面就可以了。如果要添加状态,实现State接口,然后依次加上去即可。类似链表了。 缺点显而易见,类太多了。。。。 策略模式(Strategy):它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。 用途:在不同时间需要应用不同的业务规则的时候,就可以考虑使用策略模式。 这个定义,我依然理解不了(可能智商不够高 ) 我的理解是,就代码上而言,策略模式和状态模式区别很小。状态模式是在内部判断,而策略模式是外部传入行为,直接去执行行为,而不需要再判断状态了。 修改代码如下: public interface State { public void execute(); } public class State1 implements State { public void execute() { System.out.println("1"); } } public class State2 implements State { public void execute() { System.out.println("2"); } } public class State3 implements State { public void execute() { System.out.println("3"); } } public class Find { private State state; public Find(State state) { this.state = state; } public void stateFind() { state.execute(); } } 测试 public class FindTest { Find find; @Before public void init(){ } @Test public void testTotal(){ find = new Find(new State1()); find.stateFind(); find = new Find(new State2()); find.stateFind(); find = new Find(new State3()); find.stateFind(); } } 刚开始好好研究模式,欢迎拍砖! 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-02-11
state模式和strategy模式 在head frist教程中的定义一直都不能很好的理解,主要平时编码过程中大部分都在用 factory模式。
|
|
返回顶楼 | |
发表时间:2009-02-13
state模式个人使用不多
优点是职责放在类中,替代if else 的函数式编程,从而更符合OOP的思想,提高了代码的可维护性,因为采用state模式对原有代码的修改更少,虽然会增加新的类。 strategy模式用过几次 在报表文件导出时,提供excel,pdf,html等方式 对数据进行加密时,支持多种加密算法,这些似乎都可以用到策略模式,但在简单的应用系统里优点不明显。 GOF前辈多年经验的总结,还是要理解再理解,在实践中思考 |
|
返回顶楼 | |
发表时间:2009-02-13
你这两个类如次强烈的依赖在一起,还不如使用if else.
|
|
返回顶楼 | |
发表时间:2009-02-13
状态模式的耦合比较高,是各个State之间的耦合,这个好像是没办法的,因为要传递逻辑的。
但是比if...else符合开闭原则 |
|
返回顶楼 | |