什么是状态模式
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。
什么是策略模式
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们可以相互替换,让算法独立于使用它的客户而独立变化。
本人看法
同样的都是拥有父级接口,策略模式:策略接口,状态模式:状态接口,他们都有不同的实现类去处理不同状态或是不同策略对应的方法。他们的环境对象中策略模式需要有策略对象,状态模式中需要有状态对象。在我看来完全都是同样的形式。
不同点:是在修改环境中定义属性方式不同。策略模式:利用构造方法创建策略的不同实现。每个策略都可以自由切换的。状态模式:利用set方法修改不同的状态。每个状态是相互独立的不能自由切换,一般会封装状态的转换规则。
策略模式实现:
/** * 策略抽象接口 * Created by hang on 2018/3/22. */ public interface Strategy { //子类需要实现的方法 void algorithm(); }
/** * 实现策略1: * Created by hang on 2018/3/22. */ public class MergeSortStrategy implements Strategy{ public void algorithm() { System.out.println("------这里实现了归并排序------"); } }
/** * 策略实现2 * Created by hang on 2018/3/22. */ public class QuickStrategy implements Strategy{ public void algorithm() { System.out.println("-------实现了快速排序算法------"); } }
/** * 策略模式环境对象 * Created by hang on 2018/3/22. */ public class Context { //定义策略属性 private Strategy strategy; //利用构造方法创建不同的实现 public Context(Strategy strategy){ this.strategy = strategy; } //调用当前策略属性的方法 public void algorithm(){ this.strategy.algorithm(); } }
优点:
结构清晰明了、使用简单直观
耦合度相对而言较低,扩展方便
操作封装也更为彻底,数据更为安全
缺点:
随着策略的增加,子类也会变得繁多
状态模式 :
/** * 状态抽象接口 * Created by hang on 2018/3/22. */ public interface State { void open(); void close(); }
/** * 运行状态 * Created by hang on 2018/3/22. */ public class Run implements State{ public void open() { System.out.println("————电梯运行中不能开门————"); } public void close() { System.out.println("————电梯运行中门已关闭————"); } }
/** * 停止状态 * Created by hang on 2018/3/22. */ public class Stop implements State{ public void open() { System.out.println("————电梯门已打开————"); } public void close() { System.out.println("————电梯门已关闭————"); } }
优点:
很好地体现了开闭原则和单一职责原则,每个状态都是一个子类,要增加状态就增加子类,需要修改状态,修改对应的子类即可。
状态变换放置到类的内部实现,外部的调用不用知道类内部是如何实现状态和行为的变换。
为的变换。避免了过多的switch...case或if...else语句的使用,避免了程序的复杂性,提高了系统的可维护性。
缺点:
缺点就是抽象状态的子类会太多,导致类膨胀。如果一个事物有多个状态也很正常,如果完全使用状态模式会有太多的子类,不便于管理。