`

State模式(状态模式)消除烦琐的if..else语句

 
阅读更多

State模式的定义: 不同的状态,不同的行为;或者说,每个状态有着相应的行为.
    何时使用 :State模式在实际使用中比较多,适合"状态的切换".因为我们经常会使用If elseif else 进行状态切换, 如果针对状态的这样判断切换反复出现,我们就要联想到是否可以采取State模式了.
    通常的模式下我们需要根据状态来来判断动作都是使用一连串的 if...else 语句,例如:

enum PaperColor{
    WHITE,BLACK,BLUE,RED
}

class MyPaper
{
    PaperColor paperColor;

    public MyPaper(PaperColor color){
        this.paperColor=color;
    }

    public PaperColor getMyPaperColor(){
        return this.paperColor;
    }
}

public class MainClass
{
    public static void main(String[] args)
    {
        MyPaper myPaper = new MyPaper(PaperColor.WHITE);

        if(myPaper.getMyPaperColor()==PaperColor.WHITE){
            System.out.println("You need a black pen");
        }else if(myPaper.getMyPaperColor()==PaperColor.BLACK){
            System.out.println("You need a white pen");
        }else if(myPaper.getMyPaperColor()==PaperColor.BLUE){
            System.out.println("You need a red pen");
        }else if(myPaper.getMyPaperColor()==PaperColor.RED){
            System.out.println("You need a blue pen");
        }
    }
}
 

运行结果:

You need a black pen

    白色的纸张需要黑色的笔,黑色的纸张需要白色的笔,蓝色的纸张需要红色的笔,红色的纸张需要蓝色的笔.....
    由上面程序看来,只要有多少种纸就需要多少个 else if 如果以后存在别的颜色的纸就必须在枚举里面加类型同时继续的添加 else if 然后再重新编译,显然这样的代码对日后扩展非常不利.这样的问题我们可以用State模式得到解决.

interface PaperColor{
    public void getPenColor();
}

class White implements PaperColor
{
    public void getPenColor(){
        System.out.print("You need a black pen");
    }
}

class Black implements PaperColor
{
    public void getPenColor(){
        System.out.print("You need a white pen");
    }
}

class Blue implements PaperColor
{
    public void getPenColor(){
        System.out.print("You need a red pen");
    }
}

class Red implements PaperColor
{
    public void getPenColor(){
        System.out.print("You need a blue pen");
    }
}

class MyPaper
{
    PaperColor paperColor;

    public MyPaper(PaperColor color){
        this.paperColor=color;
    }

    public PaperColor getMyPaperColor(){
        return this.paperColor;
    }

    public void choicePen(){
        this.paperColor.getPenColor();
    }
}

public class MainClass
{
    public static void main(String[] args)
    {
        PaperColor color = new Blue();
        MyPaper myPaper = new MyPaper(color);
        myPaper.choicePen();
    }
}

运行结果:
You need a red pen

    State模式不但使得程序容易扩展同时也消除了烦琐的if...else语句.

分享到:
评论
1 楼 lixieinstein 2010-10-25  
在“PaperColor color = new Blue();”这个地方就已经确定了是蓝色的笔,那么肯定不需要if...else了呀。如果这个地方的笔没有确定那状态模式也没办法自己去判断,还是需要if...else来判断。我觉得状态模式还是取代不了if...else。

相关推荐

    pri_encoder_using_if.rar_If..._pri

    总结来说,"pri_encoder_using_if.rar_If..._pri" 提供了一个使用Verilog编程语言实现的优先级编码器的例子,它利用了`if...else`语句来确定并编码最高优先级的输入。这个设计对于理解和学习数字逻辑设计,特别是...

    C#面向对象设计模式纵横谈(22):(行为型模式) State 状态模式

    - 避免了条件分支语句:状态模式将与特定状态相关的行为封装到相应的状态对象中,消除了大量的if...else或switch语句,提高了代码的可读性和可维护性。 - 允许状态转换逻辑与状态对象绑定在一起,这使得增加新的状态...

    java设计模式之-状态模式-实现

    - 消除条件语句:原本可能需要大量if...else或switch...case语句来处理不同状态的情况,现在可以通过状态对象的调用来代替,使得代码更易于理解和维护。 然而,状态模式也有一些潜在的缺点,如增加系统类和对象的...

    c++状态模式

    4. **替代大量条件分支语句**:通过状态模式,可以避免在上下文类中充斥着大量的if...else或者switch...case语句,提高了代码的可读性和可维护性。 然而,状态模式也有一定的缺点,如增加了系统类的数量,可能导致...

    试谈java设计模式之State.docx

    如果我们经常使用 If-Else 语句来判断状态并进行切换,那么就可以考虑使用 State 模式。例如,在数据库系统中,某个对象的属性不同,对象的行为也不同,这时可以使用 State 模式来实现状态切换。 State 模式的优点...

    轻松掌握state设计模式

    2. **条件语句多**:如果代码中有大量的`if-else`或`switch-case`语句用来控制对象的行为,这些语句可以根据对象的不同状态来选择执行不同的操作,则可以考虑使用State模式来简化代码结构。 3. **状态依赖**:当对象...

    ifmokuai_If..._matlabsimulink_

    7. **Stateflow图表集成**:Simulink还支持使用Stateflow图表来表示更复杂的状态机逻辑,其中包括If-Else结构,这在处理离散事件和状态转换时非常有用。 8. **调试与验证**:通过Simulink的调试工具,如示波器和...

    试谈java设计模式之State.doc

    State模式的核心思想是封装可能改变的行为到相应的状态对象中,让对象在其内部状态改变时可以调用不同的行为方法,而不是使用大量的if...else语句来判断并执行不同的行为。 在实际开发中,当一个对象的行为依赖于它...

    PB基础语句

    THEN 语句的语法格式为:IF 逻辑表达式 1 THEN 语句 1 [ELSEIF 逻辑表达式 2 THEN 语句 2 ...] [ELSE 语句 n] END IF。 示例: ``` Integer ss = integer(sle_1.text) IF s St_1.text = “不及格” ELSE St_1....

    java设计模式之State.pdf

    - 状态的切换逻辑复杂,如果使用大量的if-else或switch语句会导致代码难以理解和维护。 - 需要将状态相关的操作封装在独立的对象中,以提高代码的复用性和可扩展性。 在Java中,正确使用State模式可以有效地管理和...

    设计模式的状态模式的例子

    在某些情况下,大量使用if-else或switch语句会导致代码难以理解和维护,而状态模式则提供了一种优雅的解决方案。 总之,状态模式是一种强大的设计工具,它帮助我们在运行时动态地改变对象的行为,同时保持代码的...

    if_单片机_If..._

    if (led_state == 0xFF) { // 当所有LED都亮起时,重置状态 led_state = 0x01; } else { led_state ; // 否则,向左移动一位,下个LED亮起 } delay_ms(100); // 延时100毫秒,模拟闪烁效果 } } ``` 在这个...

    设计模式-状态模式.pdf

    当这些状态变化的逻辑变得非常复杂时,如果仅仅通过条件语句(如`if-else`或`switch-case`)来处理这些状态,代码会变得非常难以理解和维护。状态模式通过将不同的状态定义为独立的对象,解决了这一问题。 #### 三...

    登录状态判断,使用状态模式

    状态模式通常用于替代复杂的条件语句(如if...else...),使得代码更加清晰和易于管理。我们以登录状态为例来深入探讨这一模式。 在登录应用中,用户的状态主要有两种:未登录和已登录。在传统的编程方式中,我们会...

    python 实现 状态模式

    - **减少条件分支**:通过将状态行为封装在独立的类中,可以避免代码中的大量if...elif...else语句,提高代码可读性和可维护性。 - **状态转换清晰**:状态模式使状态转换显式,易于理解状态之间的关系和转换逻辑。 ...

    PB基本语句循环语句[参考].pdf

    单行 IF 语句的格式为:IF 逻辑表达式THEN 语句 1 [ELSE 语句 2],当逻辑表达式的结果为 True 时执行语句 1,否则执行语句 2(如果有该子句的话)。 例如: IF sle_State.text="BJ" THEN MessageBox(" 欢迎 ","北京...

    2 状态模式-MOOC课程内容.pdf

    当对象方法中存在大量依赖于对象状态的条件判断语句,如if-else或switch-case时,状态模式能将每个条件分支放入独立的类中,从而优化代码结构,提高可维护性和扩展性。 状态模式的主要参与者包括以下几个部分: 1....

    51单片机开发板实验:用if语句控制P0口8位LED的流水方向程序源代码.rar

    `led_state`数组则用于保存当前LED的状态,以便在if语句中根据需要调整。通过不断循环,单片机会持续监控并执行控制LED流水灯的指令。 总的来说,这个实验涵盖了51单片机的基本操作,包括I/O口配置、C语言编程以及...

    深入浅出设计模式之状态模式

    - 代码中出现了大量的条件判断语句(if-else或switch-case),并且这些条件判断依赖于同一个枚举变量时。 - 需要构建灵活的命令对象时。 ### 结构组成 状态模式主要包括以下几个组成部分: 1. **环境角色(Context)...

Global site tag (gtag.js) - Google Analytics