您的位置:首页 > 其它

设计模式21——行为型模式之状态模式

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

类型:对象行为型模式

概述:

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

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

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

类图:



参与者:

Human,也即Context通过抽象接口来调用状态对象的具体实现。

State,封装了与Human相关行为的接口。

Happy,Sad,具体实现了与相应状态下的行为。

示例代码:

[csharp] view plaincopyprint?





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();

}

}

}

适用性:

一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。

一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。

优缺点:

优点,将状态判断的逻辑移到类外面,方便通过添加新类来添加新的状态。

缺点,如果状态非常多,会导致有非常多的状态类,加大开销。

参考资料:

《设计模式——可复用面向对象软件基础》

《大话设计模式》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: