设计模式之状态模式

设计模式之状态模式

状态模式是对象的行为模式。状态模式允许一个对象在其内部状态改变的时候改变其行为。这个对象看上去就像是改变了它的类一样。

应用场景

  • 对象的行为取决于其状态,并且必须根据该状态在运行时更改其行为。
  • 通常,几个操作将包含相同的条件结构。State模式将条件的每个分支放在一个单独的类中。可以将对象的状态视为一个对象,它可以独立于其他对象而变化

概括来说,状态模式将行为包装到具体的状态对象中。每个状态对象是抽象状态的子类。状态模式意图是在改变对象的内部状态的时候,行为随之改变。

模式结构

状态模式分为三种结构:环境角色、抽象状态角色、具体状态角色

状态模式结构图

代码

电灯有两种基本行为 开启、关闭。但是有两个状态,正常和坏掉的状态。将共同的行为封装到统一的状态接口中,再根据不同的状态,创建子类完成不同状态形成不同的行为。

灯再正常状态下能够正常开启,正常关闭。等在坏掉的状态下,不能开启和关闭。状态模式就是根据这个逻辑抽离行为,将具体行为包装到具体状态对象中。

抽象状态角色

1
2
3
4
public interface State {
void open();
void close();
}

具体状态角色

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class NormalState implements State{
@Override
public void open() {
System.out.println("电灯开了!");
}

@Override
public void close() {
System.out.println("电灯关了!");
}
}

public class ErrorState implements State {
@Override
public void open() {
System.out.println("电灯开不了!");
}

@Override
public void close() {
System.out.println("电灯关不了!");
}
}

环境角色

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Context {
//状态参数
State state;
public Context(State state) {
this.state = state;
}

public void requestToOpen() {
state.open();
}

public void requestToClose() {
state.close();
}
//状态变化
public void changeStageTo(State state){
this.state = state;
}
}

客户端测试

1
2
3
4
5
6
7
8
9
10
11
public class App {
public static void main(String[] args) {
Context context = new Context(new NormalState());
context.requestToOpen();
context.requestToClose();
//将状态变更为坏的状态
context.changeStageTo(new ErrorState());
context.requestToOpen();
context.requestToClose();
}
}
-------------本文结束感谢您的阅读-------------

本文标题:设计模式之状态模式

文章作者:NanYin

发布时间:2019年06月19日 - 12:06

最后更新:2019年08月12日 - 13:08

原始链接:https://nanyiniu.github.io/2019/06/19/2019-06-19-%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E4%B9%8B%E7%8A%B6%E6%80%81%E6%A8%A1%E5%BC%8F/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。