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方法抽象成一个接口,这样会更好.
我就懒得再写了 呵呵
当然,纯粹的面向对象并不现实,我们面向对象设计目标是封装变化,如果条件和行为都是恒定的话,我们没有必要把他们封装成对象。模式的滥用和误用往往是画蛇添足。
为了解决冗长而易变的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方法抽象成一个接口,这样会更好.
我就懒得再写了 呵呵
相关文章推荐
- 设计模式学习笔记——State状态模式
- 设计模式学习笔记——State状态模式
- 设计模式C++学习笔记之十九(State状态模式)
- 【设计模式】学习笔记14:状态模式(State)
- 设计模式学习笔记——状态(State)模式框架
- 设计模式学习笔记(二十二)——State状态
- 设计模式C++学习笔记之十九(State状态模式)
- 设计模式C++学习笔记之十九(State状态模式)
- 设计模式C++学习笔记之十九(State状态模式)
- 步步为营 .NET 设计模式学习笔记 八、State(状态模式)
- 设计模式C++学习笔记之十九(State状态模式)
- 【设计模式】学习笔记14:状态模式(State)
- 设计模式C++学习笔记之十九(State状态模式)
- 步步为营 .NET 设计模式学习笔记 八、State(状态模式)
- 【设计模式学习笔记二十一】【行为模式】【状态模式(State)】
- 设计模式C++学习笔记之十九(State状态模式)
- 【设计模式】学习笔记14:状态模式(State)
- 设计模式C++学习笔记之十九(State状态模式)
- 步步为营 .NET 设计模式学习笔记 八、State(状态模式)
- 设计模式学习笔记--状态(State)模式