初尝State 模式
当对象拥有不同的状态,往往会导致行为不同。在软件构建过程中,某些对象的状态如果改变,其行为也会随之而发生变化,比如文档处于只读状态,其支持的行为和读写状态支持的行为就可能完全不同。如何在运行时根据对象的状态来透明地更改对象的行为?而不会为对象操作和状态转化之间引入紧耦合?
意图
允许一个对象在其内部状态改变时改变它的行为。从而使对象看起来似乎修改了其行为。
结构图
话说,状态的改变也能用if-else 来完成逻辑演绎,但如果系统中增添了新的状态,则耦合的代码,就显得疲惫不堪了。如果状态很多,程序员自己也很难维护。这里的state 模式,将状态改变时影响的行为抽象到一个类里,用一个个具体的子类来表达不同的状态,从而很好的封装了变化点。
代码
using System;
namespace State
{
class Program
{
static void Main(string[] args)
{
Document doc = new Document();
Editable edit = new Editable();
Insert ins = new Insert();
edit.NextState = ins;
doc.SetState(edit);
doc.Handle();
//查看轮换后的效果
doc.Handle();
}
}
abstract class StatedWithDocument {
StatedWithDocument nextState;
public StatedWithDocument NextState
{
get { return nextState; }
set { nextState = value; }
}
public abstract void Handle();
}
class Document {
StatedWithDocument state;
public void SetState(StatedWithDocument state) {
this.state = state;
}
public void Handle() {
this.state.Handle();
//也许需要轮换
this.state = this.state.NextState;
}
}
class Editable : StatedWithDocument {
public override void Handle() {
Console.WriteLine("Now,I'm Editable...");
}
}
class Insert : StatedWithDocument {
public override void Handle() {
Console.WriteLine("Now,I'm Insertable...");
}
}
}
运行结果


近期评论