首页 > 其他分享 >17_状态模式

17_状态模式

时间:2024-03-14 09:57:48浏览次数:12  
标签:状态 17 void state 模式 IState context public

状态模式是一种行为型设计模式,它允许一个对象在其内部状态改变时改变其行为。状态模式将对象的行为封装在不同的状态类中,通过改变状态类来改变对象的行为。

状态模式有三个主要角色:

  1. 环境类(Context):定义了一个状态对象的引用,并在需要的时候调用状态对象的方法。环境类可以根据内部状态的改变来改变行为。

  2. 抽象状态类(State):定义了一个接口或抽象类,用于封装状态的共同行为。具体的状态类应该实现该接口或继承该抽象类,并实现其方法。

  3. 具体状态类(Concrete State):实现了抽象状态类的接口或抽象方法,提供了具体的行为实现。

状态模式的工作原理如下:

  1. 环境类持有一个状态对象的引用,并在需要的时候调用状态对象的方法。

  2. 客户端通过调用环境类的方法来改变对象的状态。

  3. 环境类根据当前的状态对象来调用相应的方法,实现不同状态下的行为。

状态模式的优点包括:

  1. 将对象的状态和行为进行了解耦,使得对象的状态可以独立于行为变化。

  2. 可以将复杂的条件判断语句转移到状态类中,提高了代码的可读性和可维护性。

  3. 可以方便地增加新的状态类,扩展新的行为。

状态模式适用于以下场景:

  1. 当一个对象的行为取决于其内部状态,并且需要在运行时根据状态改变行为时,可以使用状态模式。

  2. 当有大量的条件判断语句需要根据对象的状态来选择不同的行为时,可以使用状态模式。

总结而言,状态模式通过将对象的行为封装在不同的状态类中,使得对象的行为可以根据内部状态的改变而改变。它提供了一种简洁的方式来处理对象的状态转换,并将复杂的条件判断语句转移到状态类中,提高了代码的可读性和可维护性。

 

案例场景:

AOI行业中的PCB板缺陷检测,顺序是:进板,MARK点定位,检测整板,检测子板,退板

IContext

public interface IContext
    {
        string SubBoard { get; set; }
        void SetState(IState state);

        void Request();
    }

 

State

public interface IState
    {
        int Flag { get; }

        void Handle(IContext context);
    }

 

Context

 /// <summary>
    /// 主板
    /// </summary>
    public class Board : IContext
    {
        private IState _state;
        public IState State => _state;
        public string SubBoard { get ; set ; }

        public Board(IState state, string subBoard)
        {
            _state = state;
            SubBoard = subBoard;
        }

        public void Request()
        {
            _state.Handle(this);
        }

        public void SetState(IState state)
        {
            _state = state;
        }
    }

 

Concrete State

/// <summary>
    /// 进板
    /// </summary>
    public class EnterState : IState
    {
        public int Flag => 1;

        public void Handle(IContext context)
        {
            Console.WriteLine("主板已进入");

            context.SetState(new MarkState());
        }
    }
/// <summary>
    /// mark定位
    /// </summary>
    public class MarkState : IState
    {
        public int Flag => 2;

        public void Handle(IContext context)
        {
            Console.WriteLine("正在进行Mark点定位....");

            context.SetState(new WholeState());
        }
    }
/// <summary>
    /// 整板检测
    /// </summary>
    public class WholeState : IState
    {
        public int Flag => 3;

        public void Handle(IContext context)
        {
            Console.WriteLine("正在进行整板检测...");

            if (context.SubBoard != null)
            {
                context.SetState(new ChildState());
            }
            else
            {
                context.SetState(new ExitState());
            }
            
        }
    }
/// <summary>
    /// 子板检测
    /// </summary>
    public class ChildState : IState
    {
        public int Flag => 4;

        public void Handle(IContext context)
        {
            Console.WriteLine("正在进行子板检测...");

            context.SetState(new ExitState());
        }
    }
/// <summary>
    /// 退板
    /// </summary>
    public class ExitState : IState
    {
        public int Flag => 5;

        public void Handle(IContext context)
        {
            Console.WriteLine("检测完毕,正在退板...");
        }
    }

 

调用

internal class Client
    {
        public void Start()
        {
            Board board = new Board(new EnterState(),"有子板");

            while(true)
            {
                board.Request();

                if(board.State.Flag == 5)
                {
                    board.Request();

                    break;
                }
            }

            Console.WriteLine("----------------漂亮的分割线-------------------");

            board = new Board(new EnterState(), null);

            while (true)
            {
                board.Request();

                if (board.State.Flag == 5)
                {
                    board.Request();

                    break;
                }
            }
        }
    }
static void Main(string[] args)
        {
            new Client().Start();

            Console.ReadKey();
        }

 

标签:状态,17,void,state,模式,IState,context,public
From: https://www.cnblogs.com/MingQiu/p/18072148

相关文章

  • 16_策略模式
    策略模式是一种行为型设计模式,它定义了一系列的算法,并将每个算法封装到独立的类中,使它们可以互相替换。策略模式使得算法可以独立于客户端而变化,客户端可以根据需要选择不同的算法。策略模式有三个主要角色:环境类(Context):它持有一个策略对象的引用,并在需要的时候调用策略对象的......
  • 洛谷 P4173 残缺的字符串 卡常小记
    首先,使用匹配函数\(P(x_i,x_j)=x_ix_j-x_i^2[j\neq0]\)。容易发现,当存在\(i\neqj\)时,\(x_ix_j\)的系数只会增加,因此根据Schwartz-Zippel引理,随机一组\(x_{1\sim26}\)对应a~z即可。然后,对于NTT的过程,有两个卡常的点:一是点积reverse后转卷积的过程是舍......
  • 面试题 17.12. BiNodec
    树遍历的变形/***Definitionforabinarytreenode.*structTreeNode{*intval;*structTreeNode*left;*structTreeNode*right;*};*/structTreeNode*convertBiNode(structTreeNode*root){if(!root)returnNULL;if(!roo......
  • Java知识点之单例模式
    1、单例模式(BinarySearch)单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但......
  • 21_Java循环模式
    循环结构while循环do…while循环for循环在Java5中引入了一种主要用于数组的增强型for循环。while循环while是最基本的循环结构:While(布尔表达式){//循环内容}要求:只要布尔表达式为true,循环就会一直执行下去多数情况会让循环停止下来,需要一个让表达式失......
  • Win10开机进不了系统以及Win10系统进入安全模式解决方法
      今天小编和大家分享Win10开机进不了系统以及进入安全模式解决方法。欢迎大家关注收藏!Win10开机无法进入系统通常可以尝试以下解决方法:一.  进入启动设置界面,按下F4进入安全模式。二. 在安全模式下,按下“Win+R”组合键打开“运行”窗口,输入“msconfig”,点击“确定......
  • 做题小计 ARC170E
    我觉得很强的题目。传送门:Luogu分析分析问题本质。根据大量推理,发现问题再描述这样一个东西:一开始有\(a,b\),一开始有\(p\)的概率使得\(a\)加一,\(1-p\)的概率使得\(b\)加一。进行\(n-1\)次操作,每次操作如下:有\(p\)的几率与上一次操作的数相同有\(1-p\)的......
  • DevOps软件开发管理模式、CICD概念及其Jenkins使用
    一、什么是DevOpsDevOps是Develop与Operations的缩写,是开发和运营维护的总称。它是企业内开发、技术运营和质量保障这三方面工作的融合,用于促进开发、技术运营和质保部门之间的沟通、协作与整合。为巩固软件设计与开发结果,将开发、运维与测试结合一起,形成了DevOps软件开发管......
  • 跟着GPT学设计模式之桥接模式
    说明桥接模式,也叫作桥梁模式,英文是BridgeDesignPattern。在GoF的《设计模式》一书中,桥接模式是这么定义的:“Decoupleanabstractionfromitsimplementationsothatthetwocanvaryindependently。”翻译成中文就是:“将抽象和实现解耦,让它们可以独立变化。”桥接模式......
  • 2016-2017西安澳鹏用户(会员)营销顾问-案例
    2016年9月12日下午第一次去萧山机场,也是人生第一次坐飞机,我记得是晚上里11点多到西安咸阳机场,当时的末班机场大巴没有了,已经不记得当时是怎么去的酒店了。和澳鹏的缘分还要向前追溯,2015年11月份的时候他们的人事当时联系到了我,想挖我但是西安实在太远了,所以当时就婉拒了,2016年8月......