设计模式-21状态模式

设计模式(21) 状态模式 状态模式允许一个对象在其内部状态改变时改变它的行为。用电梯来举例,电梯可以认为具有开门、关门、运行、停止四种状态,这四种状态之间的切换具有多种限制,比如在开门状态下不电梯不能运行,只能转为关门状态;在运行状态下,电梯只能转为停止状态… 设想一下,如果要常规的if-else或者switch-case描述电梯的这几种状态间的切换,将生成非常复杂的、逻辑相互交织的代码,可读性差且不易维护。 而如果用状态模式来实现,会是怎样的呢? 首先创建LiftState,代表抽象的电梯状态,包含了电梯的四个动作(方法),通过这 阅读详情

状态模式

基本介绍:
  • 状态模式主要用来解决对象在多种状态转换时,需要对外输出不同的行为问题,状态和行为是一一对应的,状态之间可以相互转换
  • 当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类
原理类图:

在这里插入图片描述

角色说明:
  • Context:类为环境角色,用于维护State实例,这个实例定义了当前状态
  • State:是抽象状态角色,定义一个接口封装与Context的一个特定接口相关行为
  • ConcreteState:具体状态角色,每个子类实现一个与Context的一个状态相关行为
案例:

​ 编写程序完成app抽奖活动,具体要求如下:

  • 假如每参加一次这个活动要扣除客户50积分,中奖概率为10%

  • 奖品数量有限,抽完为止

  • 活动有四个状态:可以抽奖、不能抽奖、发放奖品和奖品领完

  • 活动四个状态转换关系图
    在这里插入图片描述

/**
 * 抽象状态类,管理所有的具体状态类
 */
public abstract class State {
    //扣除50积分
    protected abstract void deduceMoney();
    //是否抽中奖品
    protected abstract boolean raffle();
    //发放奖品
    protected abstract void dispensePrize();
}

/**
 * 不能抽奖状态
 */
public class NoRaffleState extends State{
    private Activity activity;

    public NoRaffleState(Activity activity) {
        this.activity = activity;
    }

    @Override
    protected void deduceMoney() {
        System.out.println("扣除50积分,可以抽奖喽。。。");
        activity.setState(activity.getCanRaffleState());
    }

    @Override
    protected boolean raffle() {
        System.out.println("还未扣除积分不能抽奖。。。");
        return false;
    }

    @Override
    protected void dispensePrize() {
        System.out.println("还未中奖不能领取奖品。。。");
    }
}

/**
 * 可以抽奖状态
 */
public class CanRaffleState extends State {

    private Activity activity;

    public CanRaffleState(Activity activity) {
        this.activity = activity;
    }
    @Override
    protected void deduceMoney() {
        System.out.println("积分已经扣除不能重复扣除积分。。。");
    }

    @Override
    protected boolean raffle() {
        System.out.println("正在抽奖请稍等。。。");
        Random random = new Random();
        int num = random.nextInt(10);
        if(num == 0){
            activity.setState(activity.getDispenseState());
            return true;
        }else {
            System.out.println("您未中奖。。。");
            activity.setState(activity.getNoRaffleState());
            return false;
        }
    }

    @Override
    protected void dispensePrize() {
        System.out.println("没中奖,不能发放奖品哦。。。");
    }
}

/**
 * 发放奖品状态
 */
public class DispenseState extends State {
    private Activity activity;

    public DispenseState(Activity activity) {
        this.activity = activity;
    }

    @Override
    protected void deduceMoney() {
        System.out.println("不能重复扣除积分哦。。。");
    }

    @Override
    protected boolean raffle() {
        System.out.println("已经抽中奖品,正在发放奖品哦。。。");
        return false;
    }

    @Override
    protected void dispensePrize() {
        if(activity.getCount() > 0){
            System.out.println("恭喜中奖。。。");
            activity.setState(activity.getNoRaffleState());
        }else {
            System.out.println("奖品发放完了,请下次参与哦。。。");
            activity.setState(activity.getDispenseOutState());
        }
    }
}

/**
 * 奖品发放结束状态
 */
public class DispenseOutState extends State {

    private Activity activity;

    public DispenseOutState(Activity activity) {
        this.activity = activity;
    }
    @Override
    protected void dedu
状态模式的注意事项和细节:
  • 代码有很强的可读性,状态模式将每个状态的行为封装到了对应的一个类中
  • 方便维护,将容易产生问题的if-else语句删除了,如果把每个状态的行为都放到一个类中,每次调用方法时都要判断当前是什么状态,不但会产出很多if-else语句,而且容易出错
  • 符合开闭原则,容易增删状态
  • 会产生很多的类。每个状态都要有一个对应的类,当状态过多时,会产生很多类,加大维护难度
  • 应用场景:当一个事件或者对象有很多状态,状态之间会相互转换,对不同的状态要求有不同的行为的时候,可以考虑使用状态模式
C#设计模式教程(21):状态模式 状态模式(State Pattern)是一种行为设计模式,允许一个对象在其内部状态改变时改变其行为。这个对象看起来好像修改了它所属的类。状态模式主要用于实现状态机,在状态的逻辑复杂,状态数量较多,且状态转换规则较为明确的情况下,状态模式能够将各种状态的行为分离到不同的类中,提高可维护性。 阅读详情

相关推荐

车载仪表-功能点测试大全(超详细,细分可作测试用例)

汽车仪表系统发展经历了机械式、电气化到智能化的演变,目前全液晶仪表渗透率达73.4%。文章详细梳理了仪表功能测试要点,包括UI界面显示一致性、按键响应、FM收音、信号灯显示、USB功能、蓝牙连接、胎压监测、导航系统、WiFi投屏、倒车影像及多媒体播放等关键功能模块的测试标准。特别关注界面切换流畅度、功能稳定性及异常情况处理能力,如投屏状态下是否卡顿、导航中断后能否自动恢复等。测试覆盖了CarPlay、AndroidAuto等主流投屏方案的兼容性验证,确保各类交互场景下的系统可靠性。

weixin_51551002的博客 2063

java 23 种设计模式-21-java 状态模式(State Pattern)

目录 目录 状态模式 实际案例 定义 测试 实现方式 UML & Code UML Code 系列导航 状态模式 在状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。 在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。 实际案例 类信息概览: ...

3万+

DRAM内存模拟持久化设备的方法

由于持久化内存介质NVM技术的发展,越来越多的科研工作者投身到NVM相关的研究当中。但由于目前工业界并没有推出广泛使用的NVM介质设备,所以科研工作都需要自己以现有的条件,模拟NVM设备使用场景。一个简单的方法是:通过修改DRAM模拟器,达到模拟NVM的目的(可以参考:DRAMSim2模拟器分析与应用)。更高端的方式是:在真实系统中,将内存划分出一块儿,用来模拟NVM设备(类似于传统的ramdis

酷炫人笨笨熊 1897

【C#设计模式(21)——状态模式(State Pattern)】

状态模式:在对象内部发生改变时改变其行为,使得对象在不同的状态下具有不同的行为表现。

weixin_43626218的博客 610

Allegro中调整差分对等长的步骤介绍

【代码】Allegro中调整差分对等长的步骤介绍。

qq_30882617的博客 3831

数字IC后端层次化Hierarchical Flow子系统Sub-System模块 block partition和pin assignment细节盘点

数字IC后端培训教程之Hierarchical Flow子系统block partition和pin assignment详细教程

weixin_37584728的博客 1603

设计模式学习--21.状态模式(State Pattern)

package com.designepattern.statepattern.v2; /** * @Author:glx * @Date:2020/12/10 * @Content: */ public class MainDemo { public static void main(String[] args) { Context context=new Context(); context.handle(); con...

u010031813的博客 166

5G NR PDCCH实战解析:从DCI格式到CORESET配置的完整指南

本文深入解析5G NR PDCCH的实战配置,涵盖DCI格式选择、CORESET配置及Search Space优化等关键内容。基于3GPP R16标准,提供现网部署中的典型问题解决方案,如覆盖边缘失步、多用户调度冲突等,帮助提升控制信令传输效率。特别针对5G NR PDCCH的灵活资源分配和自适应编码机制进行详细探讨。

weixin_29231263的博客 496

二、21【设计模式】之状态模式

今天的博客主题 设计模式——》设计模式之状态模式 状态模式 SP (State Pattern) 定义 允许对象在内部状态发生改变时改变它的行为,看起来好像修改了它的类。 类的行为是由状态决定的,不同的状态下该类有不同的行为。就是一个对象在其内部改变的时候,它的行为也随之改变。 核心就是状态与行为的绑定,不同状态对应不同行为。 应用场景 在生活中的场景常见的就是订单状态的改变。 1)行为随状态改变而改变的场景。 2)一个操作中有大量分支存在,而这些分支状态又...

刘总Java 297

ICM20948 DMP代码详解(54)

ICM20948 DMP代码详解(54)

phmatthaus的专栏 424

如何设置反馈点

前面的POWER DC仿真都是忽略反馈线进行的仿真,如果单板压降不过,电源会自动调整输出电压,来满足负载的得到额定的电压.可以看到因为设置了反馈点,源端电压就被抬高到满足压降的值了。仿真上也可以自己添加反馈点,以得到抬高后的电源输出电压值。同样以下图的CPU的Core电源为例。按照流程正常设置好参数。

weixin_54787054的博客 1145

"围观"设计模式(21)--行为型之状态模式(State Pattern)

状态模式--允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。----百度百科 个人理解 状态模式应该说可以理解为某种状态下,程序的执行流程可能会发生变化,类似于交通灯,红灯的时候停下,绿灯行走,黄灯时等一等,这就是三种状态下我们人对其作出的相应的变化。再比如,公交车应该都坐过的,公交车停车的时候,可以上车和下车;公交车行驶的时候,不允许下车和上车,那么,

王洋的专栏 4661

《一》:LBE,VR 大空间系列——场景环境需求解析

当前,大量 VR 体验活动在室内场地开展。因此,对于场地照明有特定要求:除天花板外,场地的所有表面均需有照明覆盖。这是为了保证玩家无论处于场地的哪个位置,地面与墙面都不会出现明显的影子。场地内不建议安装射灯或高强度的点光源,若已安装此类灯具,需使用柔光板进行遮盖。此外,要避免在阳光下使用 VR 设备台。参考图(请忽略其中Maker标签)

unitygroup的博客 942

设计模式第21讲——状态模式(State)

状态模式是一种行为型设计模式。简单地讲就是,一个拥有状态的context对象,在不同状态下,其行为会发生改变。一、什么是状态模式 二、角色组成 三、 优缺点 四、应用场景4.1 生活场景4.2 java场景 五、代码实现5.0 UML类图5.1 State——抽象状态5.2 具体状态5.3 Machine——上下文5.4 testState 六、总结

让~学习~成为一种习惯(橡 皮 人の技术博客) 7538

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

C#设计模式之21——状态模式

状态模式中,可以通过对象表示应用的状态,并通过切换对象来切换应用程序的状态。可以让一个类在多个被包含的相关类之间做切换,并把方法调用差地给当前的被包含类。 我们编程中,经常会遇到基于传到类中的参数来创建不同的对象,这些对象或者显示不同的信息,或者执行不同的计算。这经常会在决定执行哪种行为的类的内部导致某些类型的select case或者if-else语句的出现,如果过多的这些语句,对于程序的理解

Work Hard, Play Harder! 4722

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

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

状态模式通过将不同状态的行为封装到独立的状态类中,提供了一种清晰的方式来管理对象在不同状态下的行为。虽然它可能引入一些额外的复杂性,但在需要管理多个状态和状态转换时,它能显著提高代码的可维护性和灵活性。

qq_55610255的博客 928

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

C++设计模式21——状态模式

https://blog.youkuaiyun.com/CoderAldrich/article/details/83183733 前言 在实际开发中,我们经常会遇到这种情况;一个对象有多种状态,在每一个状态下,都会有不同的行为。那么在代码中我们经常是这样实现的。 typedef enum tagState { state, state1, state2 }State; void Action(State actionState) { if (actionState

chenyijun的专栏 187

设计模式 21 状态模式

在标准大气压下,水在 0 ~ 100 度之间时,会呈现液态;在 0 度以下会变成固态;100 度以上会变成气态。物质在不同的条件下呈现不同的状态,对象可能也会像这样存在很多种状态,在不同的状态下可能会有不同的行为,可以通过状态模式来实现这样的效果。

天河有尽后为涯,星海无边前作岸。 196

21.设计模式——状态模式

状态模式 在状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。 在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。 介绍 意图:允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。 主要解决:对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为。 何时使用:代码中包含大量与对象状态有关的条件语句。 如何解决:将各种具体的状态类抽象出来。 关键代码:通常命令模式的接

蓝色的天空的博客 934

Java设计模式[21]-状态模式

基本介绍 状态模式(State Pattern):它主要用来解决对象在多种状态转换时,需要对外输出不同的行为的问题。状态和行为是一一对应的,状态之间可以相互转换。 当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类。 状态模式的原理类图 Context 类为环境角色, 用于维护State实例,这个实例定义当前状态。 State 是抽象状态角色,定义一个接口封装与Context 的一个特点接口相关行为。 ConcreteState 具体的状态角色,每个子类实现一个与Co

JensenPWLee的博客 250

【python设计模式】21、状态模式

状态模式是一种行为型设计模式,它将一个对象的行为和状态进行分离,从而实现了对象在不同状态下具有不同的行为表现。这种模式的核心思想是将状态抽象成一个独立的类,并将状态的转换和判断逻辑封装在状态类中,从而使得状态的变化不会对对象的行为造成影响。在上面的代码中,State是一个状态类,OffState和OnState是具体的状态类,它们实现了State中定义的抽象方法。这种模式将对象的状态和行为分离,使得同一种行为在不同的状态下可以有不同的表现,从而达到更加灵活的设计和实现。

Htojk的博客 361

设计模式(21)——状态模式

目录APP抽奖活动问题状态模式状态模式解决APP抽奖问题状态模式在实际项目-借贷平台 源码剖析状态模式的注意事项和细节 APP抽奖活动问题 请编写程序完成APP抽奖活动 具体要求如下: 假如每参加一次这个活动要扣除用户50积分,中奖概率是10% 奖品数量固定,抽完就不能抽奖 活动有四个状态:可以抽奖、不能抽奖、发放奖品和奖品领完 活动的四个状态转换关系图(下图) 状态模式 基本介绍 状态...

minge0001的博客 340

了解设计模式:21状态模式

1.场景 -电梯的运行:维修,正常,自动关门,自动开门,向上运行,向下运行,消防状态 -红绿灯:红灯,黄灯,绿灯 -网上购物,订单状态:下单,已付款,已发货,送货中,已收货 2.核心及结构 -核心:用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题 -结构:Context环境类(维护State),State抽象环境类,ConcreteS...

rensheng_ruxi的博客 224

设计模式-21状态模式(状态设计模式)详解

意图:允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。主要解决:对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为。何时使用:代码中包含大量与对象状态有关的条件语句。如何解决:将各种具体的状态类抽象出来。关键代码:通常命令模式的接口中只有一个方法。而状态模式的接口中有一个或者多个方法。而且,状态模式的实现类的方法,一般返回值,或者是改变实例变量的值。也就是说,状态模式一般和对象的状态有关。实现类的方法有不同的功能,覆盖接口中的方法。

数字人生 290

设计模式学习笔记 --- 21.状态模式

在状态模式(State Pattern)中,类的行为是基于它的状态改变的,这种类型的设计模式属于行为模式; 在状态模式中,我们创建表示各种状态的对象和一个行为随着状态改变而改变的context对象; 意图:允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类; 主要解决:对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为;...

杨鑫newlife的专栏 601
上一篇: 设计模式-20解释器模式
下一篇: 设计模式-22策略模式
胖柯G
博客等级 码龄10年 453粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值