软件模式是将模式的一般概念应用于软件开发领域,即软件开发的 总体指导思路或参照样板。
软件模式并非仅限于设计模式,还包括 架构模式、分析模式和过程模式等,
实际上,在软件生存期的每一个阶段都存在着一些被认同的模式。

状态模式的定义

  • 状态模式允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。
  • 其别名为状态对象,状态模式是一种对象行为型模式。

状态模式包含二个角色:

  • Context-环境类又称为上下文类,它是拥有状态的对象,在环境类中维护一个抽象状态类State的实例,这个实例定义当前状态,在具体实现时,它是一个State子类的对象,可以定义初始状态;
  • State-抽象状态类用于定义一个接口以封装与环境类的一个特定状态相关的行为;
  • ConcreteState-具体状态类是抽象状态类的子类,每一个子类实现一个与环境类的一个状态相关的行为,每一个具体状态类对应环境的一个具体状态,不同的具体状态类其行为有所不同。

ES6实现

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
class {
constructor(state) {
console.log("Context Class created");
switch (state) {
case "A":
this.state = new ConcreteStateA()
break
case "B":
this.state = new ConcreteStateB()
break
default:
this.state = new ConcreteStateA()
}
}
request() {
console.log('Context.request invoked');
this.state.handle(this);
}
}
class State {
constructor() {
console.log("State Class created");
}
handle() {
console.log('State.handle invoked');
}
}
class ConcreteStateA extends State {
constructor() {
super();
console.log("ConcreteStateA Class created");
}
handle(context) {
console大专栏  状态模式(State)-设计模式/span>.log('ConcreteStateA.handle invoked');
}
}
class ConcreteStateB extends State {
constructor() {
super();
console.log("ConcreteStateB Class created");
}
handle(context) {
console.log('ConcreteStateB.handle invoked');
}
}
let context = new Context("A")
context.request()

Typescript实现

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
namespace StatePattern {
export interface State {
handle(context: Context): void;
}
export class ConcreteStateA implements State {
public handle(context: Context): void {
console.log("`handle` method of ConcreteStateA is being called!");
context.State = new ConcreteStateB();
}
}
export class ConcreteStateB implements State {
public handle(context: Context): void {
console.log("`handle` method of ConcreteStateB is being called!");
context.State = new ConcreteStateA();
}
}
export class Context {
private state: State;
constructor(state: State) {
this.state = state;
}
get State(): State {
return this.state;
}
set State(state: State) {
this.state = state;
}
public request(): void {
console.log("request is being called!");
this.state.handle(this);
}
}
}

参考以下内容:

状态模式(State)-设计模式的更多相关文章

  1. 【转】设计模式 ( 十七) 状态模式State(对象行为型)

    设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...

  2. 设计模式 ( 十七) 状态模式State(对象行为型)

    设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...

  3. 乐在其中设计模式(C#) - 状态模式(State Pattern)

    原文:乐在其中设计模式(C#) - 状态模式(State Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 状态模式(State Pattern) 作者:webabcd 介绍 允 ...

  4. 北风设计模式课程---状态模式State(对象行为型)

    北风设计模式课程---状态模式State(对象行为型) 一.总结 一句话总结: 状态模式 具体状态的行为在具体的状态类中就解决,不用交给外部做判断.实质是将多条件判断弄成了多个类,在不同的类中做判断 ...

  5. 二十四种设计模式:状态模式(State Pattern)

    状态模式(State Pattern) 介绍允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它所属的类. 示例有一个Message实体类,对它的操作有Insert()和Get()方法, ...

  6. 状态模式-State Pattern(Java实现)

    状态模式-State Pattern 在状态模式(State Pattern)中,类的行为是基于它的状态改变的.当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. State接口 ...

  7. 设计模式(十二):通过ATM取款机来认识“状态模式”(State Pattern)

    说到状态模式,如果你看过之前发布的重构系列的文章中的<代码重构(六):代码重构完整案例>这篇博客的话,那么你应该对“状态模式”并不陌生,因为我们之前使用到了状态模式进行重构.上一篇博客我们 ...

  8. 设计模式之 -- 状态模式(State)

     状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类.当控制一个对象的状态转换条件分支语句(if...else或switch...case)过于复杂时,可以此模式将状态的判断逻辑 ...

  9. [设计模式] 20 状态模式 State Pattern

    在GOF的<设计模式:可复用面向对象软件的基础>一书中对状态模式是这样说的:允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类.状态模式的重点在于状态转换,很多时候,对 ...

随机推荐

  1. Linux介绍,基本命令

  2. APUE 书中 toll 函数

    今天看unix环境高级编程时,随着书上的源码打了一遍,编译时提示 toll函数未定义, 找了半天(恕我对上下文不了解).看了英文版和源代码文件才知道, 中文版打印错了: toll => atol ...

  3. is,数据类型补充,set,深浅拷贝

    十二.基础数据类型补充: 1.join 可以把列表变成字符串. s = ‘abc’ s1 = s.join(‘非常可乐’) print(s1)  #非abc常abc可abc乐abc s = " ...

  4. Win10控制桌面图标显示

    1.桌面鼠标右键,进入个性化 2.进入主题: 3.

  5. Kruskal算法详解

    本章介绍克鲁斯卡尔算法.和以往一样,本文会先对克鲁斯卡尔算法的理论论知识进行介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现. 最小生成树 在含有n个顶点的连通图中选择n-1条边, ...

  6. 量化投资_MATLAB在时间序列建模预测及程序代码

    1 ARMA时间序列机器特性 下面介绍一种重要的平稳时间序列——ARMA时间序列. ARMA时间序列分为三种: AR模型,auto regressiv model MA模型,moving averag ...

  7. DRF认证、自定义认证和权限、自定义权限

    源码分析 """ 1)APIView的dispath(self, request, *args, **kwargs) 2)dispath方法内 self.initial( ...

  8. FIT AP和FAT AP的区别

    1.Fat模式是传统的WLAN组网方案,无线AP本身承担了认证终结.漫游切换.动态密钥产生等复杂功能,相对来说AP的功能较重,因此称为Fat  AP. 2.Fit模式是新兴的一种WLAN组网模式,其相 ...

  9. js正则表达式常用的大部分函数

    1.)String方法a.)String.search()参数:可以是正则表达式也可以是普通的字符串.返回值:如果找到匹配则返回首字符的索引位置,找不到则返回-1var s = "Hello ...

  10. [LC] 389. Find the Difference

    Given two strings s and t which consist of only lowercase letters. String t is generated by random s ...