分享

设计模式21

 天才白痴书馆 2015-04-16

定义:状态模式(State Pattern),允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。

类型:对象行为型模式

概述:

一个对象有一个状态,那么每一个状态又对应一些相应的行为。如果这个对象有很多状态,那么就要对应非常多的行为。那么对这些状态的判断以及根据状态完成相应的行为,会非常复杂。并且如果想添加一种新的状态时,需要修改很多的现有代码。这也是有违开闭原则的。状态模式正是在这样一种情况下提出来的。

状态模式将每种状态对应的行为抽象出来成为单独的新的对象,这样将状态转换显式化了。状态的变换不再依赖于Context内部的行为了。另外,将状态及行为提出来能够大为降低Context对象的复杂度。另外如果一个State对应多个Context时,State还可以被多个Context对象共享。

状态,我们立马会提出,今天状态不好,做什么都没劲;又或者是今天状态很好,做事得劲,饭也吃得多。那么我们就以一个人不同时刻的状态为例来讲解状态模式。

类图:

\

参与者:

  1. Human,也即Context通过抽象接口来调用状态对象的具体实现。
    1. State,封装了与Human相关行为的接口。
      1. Happy,Sad,具体实现了与相应状态下的行为。

        示例代码:

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        25
        26
        27
        28
        29
        30
        31
        32
        33
        34
        35
        36
        37
        38
        39
        40
        41
        42
        43
        44
        45
        46
        47
        48
        49
        50
        51
        52
        53
        54
        55
        56
        57
        58
        59
        60
        61
        62
        63
        64
        65
        66
        67
        68
        69
        70
        71
        72
        73
        74
        75
        76
        77
        78
        79
        80
        81
        82
        83
        84
        85
        86
        87
        88
        89
        90
        91
        92
        93
        94
        95
        96
        97
        98
        99
        100
        101
        102
        103
        104
        105
        106
        107
        108
        109
        110
        111
        112
        using System;
        using System.Collections.Generic;
        using System.Text;
        namespace Pattern21
        {
            //抽象状态
            public abstract class State
            {
                public abstract void Eat();
                public abstract void Walk();
            }
            // 高兴时的状态
            public class Happy : State
            {
                public override void Eat()
                {
                    human.Eat();
                    Console.WriteLine("很多!");
                }
                public override void Walk()
                {
                    human.Walk();
                    Console.WriteLine("手舞足蹈的!");
                }
                public void Attach(Human _human)
                {
                    human = _human;
                }
                private Human human;
            }
            // 伤心时的状态
            public class Sad : State
            {
                public override void Eat()
                {
                    human.Eat();
                    Console.WriteLine("很少!");
                }
                public override void Walk()
                {
                    human.Walk();
                    Console.WriteLine("无精打采的!");
                }
                public void Attach(Human _human)
                {
                    human = _human;
                }
                private Human human;
            }
            
            // 一个人
            public class Human
            {
                private State current;
                public void SetState(State s)
                {
                    current = s;
                }
                public void Eat()
                {
                    Console.Write("吃了");
                }
                public void Walk()
                {
                    Console.Write("走起路来");
                }
                public void Show()
                {
                    current.Eat();
                    current.Walk();
                }
            }
            class Program
            {
                static void Main(string[] args)
                {
                    // 定义一个有很多状态的对象
                    Human human = new Human();
                    // 定义一个高兴的状态
                    Happy hState = new Happy();
                    hState.Attach(human);
                    human.SetState(hState);
                    human.Show();
                    // 定义一个伤心的状态
                    Sad sad = new Sad();
                    sad.Attach(human);
                    human.SetState(sad);
                    human.Show();
                    // 还可以添加生病的状态,只需要添加新的类而不需要修改Human类
                    // ......
                    Console.Read();
                }
            }
        }

        适用性:

        1. 一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。
        2. 一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。

          优缺点:

          1. 优点,将状态判断的逻辑移到类外面,方便通过添加新类来添加新的状态。
          2. 缺点,如果状态非常多,会导致有非常多的状态类,加大开销。

            参考资料:

            1. 《设计模式——可复用面向对象软件基础》
            2. 《大话设计模式》

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多