C#设计模式系列:状态模式(State)
1、状态模式简介
1.1>、定义
状态模式的核心思想是允许一个对象在它的内部状态改变时改变它的行为,即不同的状态对应不同的行为。
状态模式的针对性很强,当有状态变化的时候可以选择状态模式。
1.2>、使用频率
中等
2、状态模式结构
2.1>、结构图
2.2>、参与者
状态模式参与者:
◊ Context:状态管理器
° 定义对Client感兴趣的接口
° 维持一个ConcreteState子类的实例,这个实例定义当前状态
◊ State:状态,定义一个接口以封装与Context的一个特定状态相关的行为。
◊ ConcreteState:具体状态子类,每一子类实现的一个与Context的一个状态相关的行为。
3、状态模式结构实现
State.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.StatePattern.Structural
{
public abstract class State
{
public abstract void Handle(Context context);
}
}
Context.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.StatePattern.Structural
{
public class Context
{
private State _state; public Context(State state)
{
this.State = state;
} public State State
{
get
{
return _state;
}
set
{
_state = value;
Console.WriteLine("State: " + _state.GetType().Name);
}
} public void Request()
{
_state.Handle(this);
}
}
}
ConcreteStateA.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.StatePattern.Structural
{
public class ConcreteStateA : State
{
public override void Handle(Context context)
{
context.State = new ConcreteStateB();
}
}
}
ConcreteStateB.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.StatePattern.Structural
{
public class ConcreteStateB : State
{
public override void Handle(Context context)
{
context.State = new ConcreteStateA();
}
}
}
Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; using DesignPatterns.StatePattern.Structural; namespace DesignPatterns.StatePattern
{
class Program
{
static void Main(string[] args)
{
// Setup context in a state
Context c = new Context(new ConcreteStateA()); // Issue requests, which toggles state
c.Request();
c.Request();
c.Request();
c.Request();
}
}
}
运行输出:
State: ConcreteStateA
State: ConcreteStateB
State: ConcreteStateA
State: ConcreteStateB
State: ConcreteStateA
请按任意键继续. . .
4、状态模式的实践应用
假设有一个Task,其状态有4种:Pending、Running、Cancelled和Finished。
根据业务需求描述,建立状态图。
状态模式实现:
State.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.StatePattern.Practical
{
public abstract class State
{
public abstract void Start(Task task); public abstract void Cancel(Task task);
}
}
PendingState.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.StatePattern.Practical
{
public class PendingState : State
{
public override void Start(Task task)
{
task.State = new RunningState();
} public override void Cancel(Task task)
{
throw new NotImplementedException();
}
}
}
RunningState.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.StatePattern.Practical
{
public class RunningState:State
{
public override void Start(Task task)
{
// RunningState执行Start方法转为FinishedState
task.State = new FinishedState();
} public override void Cancel(Task task)
{
// RunningState执行Cancel方法转为CancelledState
task.State = new CancelledState();
}
}
}
CancelledState.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.StatePattern.Practical
{
public class CancelledState : State
{
public override void Start(Task task)
{
throw new NotImplementedException();
} public override void Cancel(Task task)
{
throw new NotImplementedException();
}
}
}
FinishedState.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.StatePattern.Practical
{
public class FinishedState : State
{
public override void Start(Task task)
{
throw new NotImplementedException();
} public override void Cancel(Task task)
{
throw new NotImplementedException();
}
}
}
Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; using DesignPatterns.StatePattern.Practical; namespace DesignPatterns.StatePattern
{
class Program
{
static void Main(string[] args)
{
Task task = new Task();
task.State = new PendingState();
//Task task = new Task(new PendingState());
task.Start();
//task.Start();
task.Cancel();
}
}
}
运行结果:
State : Pending
State : Running
State : Cancelled
请按任意键继续. . .
5、状态模式应用分析
状态模式效果:
1>、状态模式的本质是将条件语句的各个分支封装起来,从而实现了状态逻辑与动作的分离。当分支很多时,状态模式可以给代码的维护带来很大的便利。
2>、多态性的实现。
3>、状态转换的显示化。状态模式将状态的切换逻辑存放到状态对象中,可以实现状态的自动切换,使各个状态界限分明,相互独立。
4>、采用分支结构时,Context对象需要关心所有状态的切换逻辑,当分支越来越多时,复杂度也会越来越大。而状态模式中Context无需关心状态的切换逻辑,每个状态对象也只需关心状态的下一个可能状态的切换逻辑。
状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况。把状态的判断逻辑表示不同状态的一系列类中,可以把复杂的判断逻辑简化。状态模式的目的是为了将状态与不同状态下的行为进行分离,从而简化复杂的条件判断。
状态模式主要适用场景:
◊ 一个对象的行为取决于它的状态,并且必须在运行时刻根据状态改变其行为;
◊ 一个操作中包含庞大的分支结构,并且这些分支决定于对象的状态。
C#设计模式系列:状态模式(State)的更多相关文章
- 【转】设计模式 ( 十七) 状态模式State(对象行为型)
设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...
- 设计模式 ( 十七) 状态模式State(对象行为型)
设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...
- 乐在其中设计模式(C#) - 状态模式(State Pattern)
原文:乐在其中设计模式(C#) - 状态模式(State Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 状态模式(State Pattern) 作者:webabcd 介绍 允 ...
- 北风设计模式课程---状态模式State(对象行为型)
北风设计模式课程---状态模式State(对象行为型) 一.总结 一句话总结: 状态模式 具体状态的行为在具体的状态类中就解决,不用交给外部做判断.实质是将多条件判断弄成了多个类,在不同的类中做判断 ...
- 设计模式2——状态模式State
参考链接: 设计模式之状态模式:https://www.cnblogs.com/haoerlv/p/7777789.html 设计模式系列之状态模式:https://www.jianshu.com/p ...
- 二十四种设计模式:状态模式(State Pattern)
状态模式(State Pattern) 介绍允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它所属的类. 示例有一个Message实体类,对它的操作有Insert()和Get()方法, ...
- 设计模式之 -- 状态模式(State)
状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类.当控制一个对象的状态转换条件分支语句(if...else或switch...case)过于复杂时,可以此模式将状态的判断逻辑 ...
- [设计模式] 20 状态模式 State Pattern
在GOF的<设计模式:可复用面向对象软件的基础>一书中对状态模式是这样说的:允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类.状态模式的重点在于状态转换,很多时候,对 ...
- 设计模式之状态模式(State)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- 大熊君说说JS与设计模式之------状态模式State
一,总体概要 1,笔者浅谈 状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为模式. 状态模式主要解决的是当控制一个对象状态的条件表达式过于 ...
随机推荐
- byobu相关操作
http://lingbjxm.iteye.com/blog/2155833 重命名窗口:Fn F8
- [Leetcode] Repeated DNA Sequences
All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: "ACG ...
- 苹果safari浏览器window.open问题
现象:在做项目的过程中,使用window.open打开新窗口,在windows系统的ie,firefox,chrome浏览器上测试均没有问题,在苹果系统的safari浏览器上发现有些window.op ...
- linux安装oracle11g
准备oracle安装文件 Oracle11gR2包含两个文件linux_11gR2_database_1of2.zip和linux_11gR2_database_2of2.zip,将这两个文件通过SS ...
- Python 进程间通信
from multiprocessing import Process,Queue import os,time,random def write(q): print('Process to writ ...
- 体育游戏中的Player类
最近在做一个棒球的游戏,开始感觉还是挺酷炫的,但是其实做法挺朴实的,想象中的球员是多么智能,这样那样的,其实只是表象. 关于球员的类是游戏里非常重要的部分,这个玩意怎么写呢,可以这样写...... 棒 ...
- UDP和TCP的区别
UDP(User Datagram Protocol 用户数据报协议) TCP(Transmission Control Protocol 传输控制协议) UDP是一种非面向连接的传输协议,它的实现是 ...
- jquery+bootstrap实现tab切换, 每次切换时都请求数据, 点击提交分别向不同的地址提交数据
今天一个朋友叫帮做一个tab切换, 每一个tab内容区域都是从后台取出的数据, 这些数据要用表格的形式显示处理, 并且表格的内容区域可以修改, 如下所示: 例子查看请演示查看. 截图如图所示: 实现步 ...
- 关于UIScrollerView的基本用法和代理
- (void)viewDidLoad { [super viewDidLoad]; scrollView = [[UIScrollView alloc] initWithFrame:CGRectM ...
- 关于 Raphael
Raphael Javascript 是一个 Javascript的矢量库. 2010年6月15日,著名的JavaScript库ExtJS与触摸屏代码库项目jQTouch,以及SVG.VML处理库Ra ...