1 介绍
小白:x关闭当前页面,X恢复当前页面.....
Acey:小白你这是在干吗呢?
小白:最近给chrome装了个vimium插件,这样在玩的时候就不要用到鼠标了,但是快捷键忒多啦,背不过来了。。
Acey:这样哦,vimium挺好用的,就是开始可能要记住一些快捷键,不过你可以把常用的快捷键写在纸上贴在电脑旁,打开浏览器后就强制自己不要用鼠标,记不住了就看下纸条。
小白:额额,这是个好办法。
Acey:其实我们按下对应的快捷键然后会有对应的一些响应,这应该也是依赖与状态模式吧。
状态模式:State模式是行为模式的一种,它允许通过改变对象内部的状态来改变对象的行为,这个对象的改变就像是改变了这个类一样。
小白:这个听起来听简单的,就是我按ctrl+c就相当于改变了内部的状态,然后给我响应的就是复制操作,是这样吗?
Acey:对呢,就是这么简单。
小白:手动尴尬。
2 实现
首先,我们先来看看类图
其中
- State:抽象类,定义一个具体的状态所对应的响应行为的抽象方法。
- ConcreState:具体的状态类,继承State并实现该状态的行为操作。
- Context:含有State的一个引用,并负责调用具体状态类的行为操作。
具体实现
第一步:创建State抽象类
State.class
public abstract class State {
public abstract void oper(Operation oper);
}
**第二步 **:创建具体的State类
CtrlC.class / CtrlX.class / CtrlV.class
public class CtrlC extends State{
//Ctrl C
@Override
public void oper(Operation oper) {
if("Ctrl+c".equals(oper.getOper())){
System.out.println("copy operation");
}else{
oper.setState(new CtrlV());
oper.doOper();
}
}
}
public class CtrlV extends State{
//Ctrl V
@Override
public void oper(Operation oper) {
if("Ctrl+v".equals(oper.getOper())){
System.out.println("paste operation");
}else{
oper.setState(new CtrlX());
oper.doOper();
}
}
}
public class CtrlX extends State{
//Ctrl X
@Override
public void oper(Operation oper) {
if("Ctrl+x".equals(oper.getOper())){
System.out.println("cut operation");
}else{
System.out.println("error");
}
}
}
第三步:创建Context
Operation.class
public class Operation {
private String oper;
private State state;
//init concrete State
public Operation(){
state = new CtrlC();
}
//execute specific operation,then change current State
public void doOper(){
state.oper(this);
state = new CtrlC();
}
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
public String getOper() {
return oper;
}
public void setOper(String oper) {
this.oper = oper;
}
}
第四步:测试
MainClass.class
public class MainClass {
public static void main(String[] args) {
Operation operation = new Operation();
operation.setOper("Ctrl+c");
operation.doOper();
operation.setOper("Ctrl+v");
operation.doOper();
operation.setOper("Ctrl+c");
operation.doOper();
}
}
不管用户输入的是什么,我们首先都是先初始化了一个CtrlC状态,如果用户按下的不是CtrlC行为,那么CtrlC状态类就会将该行为传入到下一个CtrlV状态类中处理,以此类推,直到找到处理方案。
状态模式的主要优点也就在于封装了转换规则,将所有与某个状态有关的行为放在一个类中。且可以方便的添加新的状态。但在使用了状态模式后会增加类的个数,而且可切换状态的状态模式不符合开闭原则的需求。
喜欢的话戳一下喜欢呗。
有什么建议的话希望大家能在下方回复😋
上一篇:《备忘录模式 - 系统又炸了》
下一篇:《命令模式 - 年年年货》