行为型模式—状态模式
硬肝系列目录
创建型模式
结构型模式
行为型模式
到目前为止、23种设计模式的创建型模式 and 结构型模式都已经给大家肝完了,现在我们进入到一个全新的章节!!!
什么是状态模式(行为型模式)
对于不同的状态有不同的行为表现,在不使用状态模式的前提下,如果判断不同的状态的话我们一般会使用switch case
语句或者if-else
语句来实现,但是当有新的状态时,就回去修改我们switch case
语句或者if-else
语句,这违反了我们的开闭原则,而且也不好扩展,所以就出现了我们的状态模式
状态模式就是将状态抽象为一个接口,根据不同的状态创建不同的实现类,分别代表不同的行为,可以很好的作为switch case
语句或者if-else
语句的代替者,但其实状态模式也不是完美支持开闭原则的,当创建一个新的状态或者修改状态的行为时都需要修改之前的源代码,一般我们使用状态模式的场景是我们的行为受到状态的约束,且状态不宜超过5个,超过5个势必会增加系统复杂度,得不偿失
示例
我们这里已电灯开关的为示例,开灯为一个状态,关灯为一个状态
定义一个状态接口
public interface State {
void doSomething();
void change(Context context);
}
两个接口实现类
public class StateOpen implements State{
@Override
public void doSomething() {
System.out.println("灯光处于开启状态");
}
@Override
public void change(Context context) {
context.setState(new StateClose());
}
}
public class StateClose implements State {
@Override
public void doSomething() {
System.out.println("灯光处于关闭状态");
}
@Override
public void change(Context context) {
context.setState(new StateOpen());
}
}
环境类
public class Context {
private State state;
public Context() {
//设置初始状态
this.state = new StateClose();
}
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
public void change(){
state.change(this);
}
public void doSomething(){
state.doSomething();
}
}
环境类中维护了一个状态类的接口,需要改变状态时调用change()即可改变
测试类
public class Test {
public static void main(String[] args) {
Context context = new Context();
//初始状态做的事
context.doSomething();
//改变状态
context.change();
//改变后状态做的事
context.doSomething();
}
}
测试结果
灯光处于关闭状态
灯光处于开启状态
优点
满足单一职责,结构清晰
状态类职责明确,易于扩展
减少对象间的相互依赖
缺点
当状态类过多势必会增加系统复杂度
要维护好状态类之间的转换不是一件容易的事
完成:TO: 2021/4/6 18:35