您的位置:首页 > 其它

State 状态模式 - Design Patterns 学习笔记 (8)

2008-11-11 11:24 417 查看
if-else,switch-case之类的条件分支语句,是典型的机器线性思维的表现,并不是面向对象的方式。

当然,纯粹的面向对象并不现实,我们面向对象设计目标是封装变化,如果条件和行为都是恒定的话,我们没有必要把他们封装成对象。模式的滥用和误用往往是画蛇添足。

为了解决冗长而易变的switch-case而带来的笨拙,状态模式就应运而生了。它把每一个分支都封装成为一个类,当调用方法时,由状态类(分支类)判断当前状态,如果不属于本状态就继续调用下一个状态.

下面是一个状态模式的例子,只为演示,可能场景不是很合适,有滥用模式的嫌疑O(∩_∩)O哈哈~

根据当前时间来判断是上午还是下午,并把结果打印出来.

using System;

class Display {

private IState currentState;

private int hour;

public Display() {

currentState = new Morning();

}

public IState CurrentState {

set {currentState = value;}

}

public int Hour {

get {return hour;}

set {hour = value;}

}

public void Show() {

currentState.Handle(this);

}

}

interface IState {

void Handle(Display disp);

}

class Morning:IState {

public void Handle(Display disp) {

if(disp.Hour<=12) {

Console.WriteLine("It is morning now.");

} else {

disp.CurrentState = new Afternoon();

disp.Show();

}

}

}

class Afternoon:IState {

public void Handle(Display disp) {

if(disp.Hour>12) {

Console.WriteLine("It is afternoon now.");

}

}

}

public class Test {

static void Main() {

Display disp = new Display();

disp.Hour = 8;

disp.Show();

disp.Hour = 16;

disp.Show();

Console.ReadLine();

}

}

运行结果:

It is morning now.
It is afternoon now.

如果仔细思考,可以发现这里的Display类也是一个变化点,可以把Hour和Show方法抽象成一个接口,这样会更好.

我就懒得再写了 呵呵
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: