设计模式之美:State(状态)

简介:

索引

意图

允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。

Allow an object to alter its behavior when its internal state changes. The object will appear to change its class.

结构

参与者

Context

  • 定义客户感兴趣的接口。
  • 维护一个 ConcreteState 子类的实例,这个实例定义当前状态。

State

  • 定义一个接口以封装与 Context 的一个特定状态相关的额行为。

ConcreteState

  • 每一个子类实现一个与 Context 的一个状态相关的行为。

适用性

在以下情况下可以使用 State 模式:

  • 一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为。
  • 一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。这个状态通常用一个或多个枚举常量表示。

效果

  • 它将与特定状态相关的行为局部化。
  • 它使得状态转换显式化。
  • State 对象可被共享。

相关模式

  • 使用 Flyweight 模式共享状态对象。
  • 使用 Singleton 模式实现状态对象。

实现

实现方式(一):由 ConcreteState 指定它的后继 State。

State 模式不指定哪一个参与者定义状态转换规则。

如果该转换规则是固定的,那么它们可在 Context 中完全实现。

然而若让 State 子类自身指定它们的后继状态以及何时进行转换,通常更为灵活。

这需要 Context 增加一个接口,可以显示地设定 State。

这种实现的缺点是,一个 State 子类至少拥有一个其他子类的信息,使子类间产生了依赖。

复制代码
 1 namespace StatePattern.Implementation1
 2 {
 3   public abstract class State
 4   {
 5     public abstract string Name { get; }
 6     public abstract void Handle(Context context);
 7   }
 8 
 9   public class Context
10   {
11     private State _state;
12 
13     public Context()
14     {
15     }
16 
17     public void SetState(State state)
18     {
19       _state = state;
20       Console.WriteLine("Current State: {0}", _state.Name);
21     }
22 
23     public void Request()
24     {
25       _state.Handle(this);
26     }
27   }
28 
29   public class ConcreteStateA : State
30   {
31     public override string Name { get { return "StateA"; } }
32 
33     public override void Handle(Context context)
34     {
35       Console.WriteLine(Name + " is handling context.");
36 
37       // change context state
38       context.SetState(new ConcreteStateB());
39     }
40   }
41 
42   public class ConcreteStateB : State
43   {
44     public override string Name { get { return "StateB"; } }
45 
46     public override void Handle(Context context)
47     {
48       Console.WriteLine(Name + " is handling context.");
49 
50       // change context state
51       context.SetState(new ConcreteStateA());
52     }
53   }
54 
55   public class Client
56   {
57     public void TestCase1()
58     {
59       var context = new Context();
60       context.SetState(new ConcreteStateA());
61 
62       context.Request();
63       context.Request();
64     }
65   }
66 }
复制代码
目录
相关文章
|
6月前
|
设计模式 程序员
设计模式-状态模式(State)
设计模式-状态模式(State)
60 0
|
设计模式
设计模式~状态模式(state)-23
在状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的context对象。 目录 (1)优点: (2)缺点: (3)使用场景: (4)注意事项: (5)应用实例: 代码
63 1
|
设计模式
设计模式19 - 状态模式【State Pattern】
设计模式19 - 状态模式【State Pattern】
41 0
|
设计模式 Java 开发者
【设计模式——学习笔记】23种设计模式——状态模式State(原理讲解+应用场景介绍+案例介绍+Java代码实现)
【设计模式——学习笔记】23种设计模式——状态模式State(原理讲解+应用场景介绍+案例介绍+Java代码实现)
89 0
|
设计模式
从零开始学设计模式(十八):状态模式(State Pattern)
状态模式(State Pattern)指的是将一个对象的状态从该对象中分离出来,封装到专门的状态类中,使得对象状态可以灵活变化,在其内部状态改变时改变它的行为。状态模式是一种对象行为型模式。它和策略模式有一点很像,就是将一些复杂的逻辑放在一个专门的上下文类中进行处理。
1259 0
从零开始学设计模式(十八):状态模式(State Pattern)
|
设计模式 Java uml
Java中23种面试常考的设计模式之状态模式(State)---行为型模式
Java中23种面试常考的设计模式之状态模式(State)---行为型模式
109 1
|
设计模式 Java
Java设计模式-状态模式(State)
Java设计模式-状态模式(State)
|
设计模式 Java 编译器
设计模式学习(五):State状态模式
在面向对象编程中,是用类表示对象的。也就是说,程序的设计者需要考虑用类来表示什么东西。类对应的东西可能存在于真实世界中,也可能不存在于真实世界中。
156 0
设计模式学习(五):State状态模式
|
设计模式
设计模式实战-状态模式(State Pattern)(中)
设计模式实战-状态模式(State Pattern)(中)
136 0
设计模式实战-状态模式(State Pattern)(中)
|
设计模式 Java
【愚公系列】2021年12月 二十三种设计模式(二十)-状态模式(State Pattern)
【愚公系列】2021年12月 二十三种设计模式(二十)-状态模式(State Pattern)
111 0
【愚公系列】2021年12月 二十三种设计模式(二十)-状态模式(State Pattern)

热门文章

最新文章

  • 1
    《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
    44
  • 2
    C++一分钟之-C++中的设计模式:单例模式
    51
  • 3
    《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
    36
  • 4
    《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
    59
  • 5
    Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
    54
  • 6
    Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
    39
  • 7
    Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
    49
  • 8
    Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
    102
  • 9
    Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
    74
  • 10
    Go语言设计模式:使用Option模式简化类的初始化
    71