设计模式-状态模式
程序员文章站
2022-05-05 23:33:02
...
状态模式(State Pattern)
当一个对象的内在状态改变时允许改变其行为,这个对象看起来就像是改变了。
举例:Word文本编辑器的两种模式:编辑模式、预览模式,在编辑模式下可以添加、修改、删除、查看文档,而在预览模式下只能查看文档。
Context类,用于保存当前模式
测试类
测试结果
当一个对象的内在状态改变时允许改变其行为,这个对象看起来就像是改变了。
举例: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(); } }
测试结果
---当前模式:编辑模式--- 编辑模式[添加] 编辑模式[修改] 编辑模式[删除] 编辑模式[删除] ---当前模式:预览模式--- 预览模式不支持添加 预览模式不支持修改 预览模式不支持删除 预览模式不支持删除