状态模式(State Pattern)
当一个对象的内在状态改变时允许改变其行为,这个对象看起来就像是改变了。
举例:Word文本编辑器的两种模式:编辑模式、预览模式,在编辑模式下可以添加、修改、删除、查看文档,而在预览模式下只能查看文档。
Context类,用于保存当前模式
public class Context {
//预览模式
public static final int PREVIEW_STATE=-1;
//编辑模式
public static final int EDIT_STATE=0;
//当前状态
private IState curState;
public void changeState(IState state){
this.curState=state;
}
public void getCurStateDesc(){
System.out.println("---当前模式:"+(this.curState instanceof EditState?"编辑模式":"预览模式")+"---");
this.curState.add();
this.curState.update();
this.curState.delete();
this.curState.delete();
}
}
public interface IState {
/**
* description 转换状态
* @param context 上下文
* @param state 要转换的状态
*/
public void convertState(Context context,int state);
/**
* description 添加文档
*/
public void add();
/**
* description 修改文档
*/
public void update();
/**
* description 删除文档
*/
public void delete();
/**
* description 查看文档
*/
public void view();
}
public class EditState implements IState{
@Override
public void convertState(Context context, int state) {
if(state==Context.PREVIEW_STATE){
context.changeState(new PreviewState());
}
}
@Override
public void add() {
System.out.println("编辑模式[添加]");
}
@Override
public void update() {
System.out.println("编辑模式[修改]");
}
@Override
public void delete() {
System.out.println("编辑模式[删除]");
}
@Override
public void view() {
System.out.println("编辑模式[查看]");
}
}
public class PreviewState implements IState{
@Override
public void convertState(Context context, int state) {
if(state==Context.EDIT_STATE){
context.changeState(new EditState());
}
}
@Override
public void add() {
System.out.println("预览模式不支持添加");
}
@Override
public void update() {
System.out.println("预览模式不支持修改");
}
@Override
public void delete() {
System.out.println("预览模式不支持删除");
}
@Override
public void view() {
System.out.println("预览模式[查看]");
}
}
public class Demo {
public static void main(String[] args) {
Context context=new Context();
context.changeState(new EditState());
context.getCurStateDesc();
//切换为预览模式
context.changeState(new PreviewState());
context.getCurStateDesc();
}
}
测试结果
---当前模式:编辑模式---
编辑模式[添加]
编辑模式[修改]
编辑模式[删除]
编辑模式[删除]
---当前模式:预览模式---
预览模式不支持添加
预览模式不支持修改
预览模式不支持删除
预览模式不支持删除