什么是状态模式
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。
什么是策略模式
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们可以相互替换,让算法独立于使用它的客户而独立变化。
本人看法
同样的都是拥有父级接口,策略模式:策略接口,状态模式:状态接口,他们都有不同的实现类去处理不同状态或是不同策略对应的方法。他们的环境对象中策略模式需要有策略对象,状态模式中需要有状态对象。在我看来完全都是同样的形式。
不同点:是在修改环境中定义属性方式不同。策略模式:利用构造方法创建策略的不同实现。每个策略都可以自由切换的。状态模式:利用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语句的使用,避免了程序的复杂性,提高了系统的可维护性。
缺点:
缺点就是抽象状态的子类会太多,导致类膨胀。如果一个事物有多个状态也很正常,如果完全使用状态模式会有太多的子类,不便于管理。