状态模式——详解红绿灯问题

状态模式——详解红绿灯问题

状态模式的定义是这样的:
允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。

下面做一个简答的解释,就是说当对象的状态改变了之后,再次调用对象的方法,对象会提供不同的动作。下面是一个例子:


这个是一个红绿灯问题(为了解释状态模式)。面前有一盏灯和3个按钮,灯在不同状态下按不同的灯,会给出当前转换到某种灯的状态,同时灯的颜色会发生变化。

好,下面是这个问题的解决方案:



下面是具体实现:
IState.java
package com.xueyou.demo.service;

public interface IState {
    public void buttonAPress();

    public void buttonBPress();

    public void buttonCPress();
}

StateBlack.java
package com.xueyou.demo.serviceimpl;

import com.xueyou.demo.Singnal;
import com.xueyou.demo.service.IState;

public class StateBlack implements IState{
    private Singnal singnal;

    public StateBlack(Singnal singnal) {
        this.singnal = singnal;
    }

    @Override
    public void buttonAPress() {
        System.out.println("turn to yellow");
        
    }

    @Override
    public void buttonBPress() {
        System.out.println("turn to close");
        singnal.setState(singnal.getStateEnd());
    }

    @Override
    public void buttonCPress() {
    }
}

StateEnd.java
package com.xueyou.demo.serviceimpl;

import com.xueyou.demo.Singnal;
import com.xueyou.demo.service.IState;

public class StateEnd implements IState {
    private Singnal singnal;

    public StateEnd(Singnal singnal) {
        this.singnal = singnal;
    }

    @Override
    public void buttonAPress() {

    }

    @Override
    public void buttonBPress() {

    }

    @Override
    public void buttonCPress() {

    }
}

StateGreen.java
package com.xueyou.demo.serviceimpl;

import com.xueyou.demo.Singnal;
import com.xueyou.demo.service.IState;

public class StateGreen implements IState{
    private Singnal singnal;

    public StateGreen(Singnal singnal) {
        this.singnal = singnal;
    }

    @Override
    public void buttonAPress() {
        System.out.println("turn to yellow");
        singnal.setState(singnal.getStateYellow());
    }

    @Override
    public void buttonBPress() {
    }

    @Override
    public void buttonCPress() {
        System.out.println("turn to red");
        singnal.setState(singnal.getStateRed());
    }
}

StateRed.java
package com.xueyou.demo.serviceimpl;

import com.xueyou.demo.Singnal;
import com.xueyou.demo.service.IState;

public class StateRed implements IState{
    private Singnal singnal;

    public StateRed(Singnal singnal) {
        this.singnal = singnal;
    }

    @Override
    public void buttonAPress() {
        System.out.println("turn to green");
        singnal.setState(singnal.getStateGreen());
    }

    @Override
    public void buttonBPress() {
    }

    @Override
    public void buttonCPress() {
        System.out.println("turn to yellow");
        singnal.setState(singnal.getStateYellow());
    }
}

StateStart.java
package com.xueyou.demo.serviceimpl;

import com.xueyou.demo.Singnal;
import com.xueyou.demo.service.IState;

public class StateStart implements IState {
    private Singnal singnal;

    public StateStart(Singnal singnal) {
        this.singnal = singnal;
    }

    @Override
    public void buttonAPress() {
        System.out.println("turn to black");
        singnal.setState(singnal.getStateBlack());
    }

    @Override
    public void buttonBPress() {
    }

    @Override
    public void buttonCPress() {

    }
}

StateYellow.java
package com.xueyou.demo.serviceimpl;

import com.xueyou.demo.Singnal;
import com.xueyou.demo.service.IState;

public class StateYellow implements IState {
    private Singnal singnal;

    public StateYellow(Singnal singnal) {
        this.singnal = singnal;
    }

    @Override
    public void buttonAPress() {
        System.out.println("turn to red");
        singnal.setState(singnal.getStateRed());
    }

    @Override
    public void buttonBPress() {
        System.out.println("turn to black");
        singnal.setState(singnal.getStateBlack());
    }

    @Override
    public void buttonCPress() {
        System.out.println("turn to green");
        singnal.setState(singnal.getStateGreen());
    }
}

package com.xueyou.demo;

import com.xueyou.demo.service.IState;
import com.xueyou.demo.serviceimpl.*;

import java.util.HashMap;
import java.util.Map;


public class Singnal {

    private IState stateStart;
    private IState stateEnd;
    private IState stateBlack;
    private IState stateYellow;
    private IState stateRed;
    private IState stateGreen;


    private IState state = stateStart;
    private Map<String, String> stateMap = new HashMap<>();

    public IState getStateStart() {
        return stateStart;
    }

    public IState getStateEnd() {
        return stateEnd;
    }

    public IState getStateBlack() {
        return stateBlack;
    }

    public IState getStateYellow() {
        return stateYellow;
    }

    public IState getStateRed() {
        return stateRed;
    }

    public IState getStateGreen() {
        return stateGreen;
    }

    public IState getState() {
        return state;
    }

    public void setState(IState state) {
        this.state = state;
    }

    public Singnal() {
        stateStart = new StateStart(this);
        stateEnd = new StateEnd(this);
        stateBlack = new StateBlack(this);
        stateYellow = new StateYellow(this);
        stateRed = new StateRed(this);
        stateGreen = new StateGreen(this);
        this.state = stateStart;
        stateMap.put("StateStart", "Start");
        stateMap.put("StateYellow", "Yellow");
        stateMap.put("StateBlack", "Black");
        stateMap.put("StateRed", "Red");
        stateMap.put("StateGreen", "Green");
        stateMap.put("StateEnd", "End");
    }

    public Singnal buttonAPress() {
        state.buttonAPress();
        return this;
    }

    public Singnal buttonBPress() {
        state.buttonBPress();
        return this;
    }

    public Singnal buttonCPress() {
        state.buttonCPress();
        return this;
    }

    public Singnal showState() {
        System.out.println("now state is : " + stateMap.get(this.state.getClass().getSimpleName()));
        return this;
    }
}
App.java
package com.xueyou.demo;

/**
 * Hello world!
 */
public class App {
    public static void main(String[] args) {
        Singnal singnal = new Singnal();
        singnal.showState().buttonAPress().showState().buttonAPress()
                .showState().buttonAPress().showState().buttonAPress()
                .showState().buttonAPress().showState().buttonBPress()
                .showState().buttonBPress().showState();
    }
}

运行结果:



  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Django 中,ModelSerializer 是 Django REST Framework 中最常用的序列化器之一。它是一个自动化序列化组件,可以帮助我们快速地将一个 Django 模型转换成一个 RESTful API 的响应格式。 具体来说,ModelSerializer 将一个 Django 模型转换成一个 JSON 格式的响应,同时也可以将一个 JSON 格式的请求转换成 Django 模型。这使得我们能够很方便地将 Django 模型与 RESTful API 集成起来。 使用 ModelSerializer 需要进行如下步骤: 1. 创建一个继承自 ModelSerializer 的序列化器类。 2. 在序列化器类中指定模型类和需要序列化的字段。 3. 在视图函数中使用序列化器类进行序列化。 下面是一个示例代码: ```python from rest_framework import serializers from myapp.models import MyModel class MyModelSerializer(serializers.ModelSerializer): class Meta: model = MyModel fields = '__all__' ``` 上述代码中,我们首先导入了 serializers 模块和 MyModel 模型类。然后,我们创建了一个名为 MyModelSerializer 的序列化器类,它继承自 ModelSerializer。在序列化器类的 Meta 类中,我们指定了模型类为 MyModel,并且将 fields 属性设置为 '__all__',表示序列化所有字段。 接下来,在视图函数中使用 MyModelSerializer 进行序列化: ```python from rest_framework import generics from myapp.serializers import MyModelSerializer from myapp.models import MyModel class MyModelList(generics.ListCreateAPIView): queryset = MyModel.objects.all() serializer_class = MyModelSerializer ``` 上述代码中,我们首先导入了 generics 模块、MyModelSerializer 序列化器类和 MyModel 模型类。然后,我们创建了一个名为 MyModelList 的视图类,它继承自 generics.ListCreateAPIView。在视图类中,我们指定了查询集为 MyModel.objects.all(),序列化器类为 MyModelSerializer。 以上就是 ModelSerializer 的基本使用方法。通过 ModelSerializer,我们可以很方便地将一个 Django 模型转换成一个 RESTful API 的响应格式,使得我们能够更加方便地构建 Web 应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值