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方法抽象成一个接口,这样会更好.
我就懒得再写了 呵呵