设计模式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();
}
}
}
适用性:
一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。
一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。
优缺点:
优点,将状态判断的逻辑移到类外面,方便通过添加新类来添加新的状态。
缺点,如果状态非常多,会导致有非常多的状态类,加大开销。
参考资料:
《设计模式——可复用面向对象软件基础》
《大话设计模式》
类型:对象行为型模式
概述:
一个对象有一个状态,那么每一个状态又对应一些相应的行为。如果这个对象有很多状态,那么就要对应非常多的行为。那么对这些状态的判断以及根据状态完成相应的行为,会非常复杂。并且如果想添加一种新的状态时,需要修改很多的现有代码。这也是有违开闭原则的。状态模式正是在这样一种情况下提出来的。
状态模式将每种状态对应的行为抽象出来成为单独的新的对象,这样将状态转换显式化了。状态的变换不再依赖于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();
}
}
}
适用性:
一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。
一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。
优缺点:
优点,将状态判断的逻辑移到类外面,方便通过添加新类来添加新的状态。
缺点,如果状态非常多,会导致有非常多的状态类,加大开销。
参考资料:
《设计模式——可复用面向对象软件基础》
《大话设计模式》
相关文章推荐
- 设计模式21——行为型模式之状态模式
- 设计模式(十九)状态模式(State)-行为型
- 设计模式21:State 状态模式(行为型模式)
- 21 行为型模式-----状态模式
- 设计模式(21)--状态模式
- "围观"设计模式(21)--行为型之状态模式(State Pattern)
- e学编程之《设计模式》篇-状态模式
- 设计模式(二十二)—中介者模式(行为型)
- PHP设计模式:行为型之状态(State)
- 设计模式(迭代器模式)----- 行为型模式
- 状态模式State(对象行为型)
- GoF23种设计模式之行为型模式之状态模式
- 设计模式-行为型模式,状态模式(14)
- 设计模式笔记(21)---备忘录模式(行为型)
- 设计模式(十五):Iterator迭代器模式 -- 行为型模式
- 设计模式(行为型)之职责链模式(Chain of Responsibility Pattern)
- 设计模式(14) ------------状态模式
- 设计模式笔记(22)---状态模式(行为型)
- 设计模式(21)-策略模式
- 八、状态模式State(行为型模式)