设计模式之(十七)状态模式State
由简单的开始会比较好理解状态模式的作用,先来看一个列子如果你有一个只能顺时针转动的瓦斯开关,转动一次的状态为OFF Small fire 与 large fire ,你如何在程序中控制状态于行为变化呢?
一个最简单的方式就是用if else 或是sweitch如
enum DocumentState { Readonly, Editable } public class Document { DocumentState State; public void Handle() {
if(state.Readonly == state)
{
}
if(state.Editable == state)
{
}
} }
文档增加一种新的状态,如Printing时,由于紧耦合的存在,将需要同时破坏原枚举类型和Document类两个对象。采用State 模式的情况
abstract class StatedDocument
{
public abstract void Handle1();
public abstract void handle2();
public StatedDocument NextState{set;}//状态流转后更改到新的状态
}
public class ReadonlyDocument:StatedDocument{}
public class EditableDocument:StatedDocement{}
public class Document
{
//当文档改变时,只需要设置这个对象
//新的statedDocument的只就可以啦
StateDocument statedDocument{set;}
public void Handle1()
{
statedDocument.Handle1();
}
public void Handle2()
{
statedDocument.Handle2();
}
}
在这种模式,我们只需要增加一个继承自StatedDocument的printingDocument类,在调用时给Document对象在statedDocument属性赋值就可以啦。同时我们可以在StateDocument类中预定义到状态的切换。