最近学习的时候遇到了一些问题,《阿里代码规范》提到了大段的if-else可以用状态模式代替,而《java设计模式》一书中说if-else可以用策略模式代替。
有点不解,所以在深入了解后,决定写一篇博客记录一下。
翻了一下gof的《设计模式》发现两者的结构几乎一模一样。。。
状态模式适用性:
1、一个对象的香味取决于他的状态,并且他必须在运行时刻根据状态改变他的行为。
2、一个操作中包含庞大的多分支的条件语句,且这些分支依赖于改对象的状态。
策略模式适用性:
1、许多相关的类仅仅是行为有异。
2、需要使用一个算法的不同变体。
3、算法使用客户不应该知道的数据。
4、一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的分支条件移入他们各自的strategy类中代替这些条件语句。
两者适用场景非常相似,最大的差别是我们赋予了状态模式的类,“状态“这一抽象属性。
这导致了
1、策略模式常用于单个操作,状态模式应用于多个操作。
2、策略模式之间不存在状态转换,状态模式之间可能存在状态的转换。
要说到重构if-else其实他们都是可行的,只是有不同的使用场景罢了。