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

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

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

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

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

 

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

  1. using System;
  2. class Display {
  3.     private IState currentState;
  4.     private int hour;
  5.     
  6.     public Display() {
  7.         currentState = new Morning();
  8.     }
  9.     
  10.     public IState CurrentState {
  11.         set {currentState = value;}
  12.     }
  13.     
  14.     public int Hour {
  15.         get {return hour;}
  16.         set {hour = value;}
  17.     }
  18.     
  19.     public void Show() {
  20.         currentState.Handle(this);
  21.     }
  22. }
  23. interface IState {
  24.     void Handle(Display disp);
  25. }
  26. class Morning:IState {
  27.     public void Handle(Display disp) {
  28.         if(disp.Hour<=12) {
  29.             Console.WriteLine("It is morning now.");
  30.         } else {
  31.             disp.CurrentState = new Afternoon();
  32.             disp.Show();
  33.         }
  34.     }
  35. }
  36. class Afternoon:IState {
  37.     public void Handle(Display disp) {
  38.         if(disp.Hour>12) {
  39.             Console.WriteLine("It is afternoon now.");
  40.         }
  41.     }
  42. }
  43. public class Test {
  44.     static void Main() {
  45.         Display disp = new Display();
  46.         disp.Hour = 8;
  47.         disp.Show();
  48.         disp.Hour = 16;
  49.         disp.Show();
  50.         Console.ReadLine();
  51.     }
  52. }

运行结果:

It is morning now.
It is afternoon now.

 

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

我就懒得再写了 呵呵

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值