`

设计模式(17)- 状态模式

阅读更多

状态模式

1.定义

        允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。

2.示例代码

        代码演示了对投票行为的相应处理。

  

/*封装一个投票状态的相关行为*/
public interface VoteState{
   //处理状态对应的行为
   public void vote(String user,String voteItem,VoteManager voteManager);
}

/*正常投票状态的处理*/
public class NormalVoteState implements VoteState{
  public void vote(String user,String voteItem,VoteManager voteManager){
       //记录到投票记录中
       voteManager.getMapVote().put(user,voteItem);
       System.out.println("恭喜你投票成功");
   }
}

/*重复投票状态对应的处理*/
public class RepeatVoteState implements VoteState{ 
   public void vote(String user,String voteItem,VoteManager voteManager){
       //重复投票暂不处理
       System.out.println("请不要重复投票");
   }
}

/*多次投票状态对应的处理*/
public class SpiteVoteState implements VoteState{ 
   public void vote(String user,String voteItem,VoteManager voteManager){
       //取消用户投票资格,并取消投票记录
       String s = voteManager.getMapVote().get(user);
       if(s != null){
          voteManager.getMapVote().remove(user);
       }
       System.out.println("太多次的投票,取消投票资格");
   }
}

/*取消使用状态对应的处理*/
public class SpiteVoteState implements VoteState{ 
   public void vote(String user,String voteItem,VoteManager voteManager){
       System.out.println("不能使用本系统");
   }
}

   

/*投票管理*/
public class VoteManager{
   //持有状态处理对象
   private VoteState state = null;
   //记录用户投票的结果,记录用户投票的选项
   private Map<String,String> mapVote = new HashMap<String,String>();
   //记录用户投票的次数
   private Map<String,String> mapVoteCount = new HashMap<String,String>();
   public Map<String,String> getMapVote(){
       return mapVote;
   }
   //处理投票逻辑
   public void vote(String user,String voteItem){
      //记录用户投票次数
      Integer oldVoteCount = mapVoteCount.get(user);
      if(oldVoteCount == null){
          oldVoteCount = 0;
      }
      oldVoteCount += 1;
      mapVoteCount.put(user,oldVoteCount); 
      //判断用户投票状态
      if(oldVoteCount == 1){
          state = new NormalVoteState();
      }else if(oldVoteCount >1 && oldVoteCount < 5){
          state = new RepeatVoteState();
      }else if(oldVoteCount >=5 && oldVoteCount < 8){
          state = new SpiteVoteState();
      }else if(oldVoteCount >= 8){
          state  = new BlackVoteState();
      }
      state.vote(user,voteItem,this);
   }
}

   

/*客户端调用投票*/
public class Client{
    public static void main(String agr[]){
        VoteManager vm = new VoteManager();
        for(int i=0;i<0;i++){
           vm.vote("u1","A");
        }
    }
}

3.实际应用

      状态模式可以简化控制逻辑,但是也有个很明显的缺点,一个状态对应一个处理类,会使得程序引入太多的状态类,这样程序变得杂乱。

 

状态模式的本质:根据状态来分离和选择行为
分享到:
评论

相关推荐

    设计模式精解-GoF-23种设计模式解析--附C++源代码

    - 状态模式(State):允许对象在其内部状态改变时改变它的行为。 - 策略模式(Strategy):定义一系列的算法,把它们一个个封装起来,并且使它们可以互相替换。 - 模板方法模式(Template Method):定义一个...

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

    状态模式是一种行为设计模式,它允许对象在内部状态改变时改变其行为,对象看起来似乎修改了它的类。这种模式常用于处理对象的状态变化,并且在不同的状态下,对象的行为也相应地变化。在Java中,我们可以利用接口、...

    java-设计模式-状态模式-模拟审批流程-二级审批 完整代码

    状态模式是一种行为设计模式,它允许对象在内部状态改变时改变其行为,对象看起来似乎修改了它的类。在这个示例中,我们关注的是如何使用Java实现一个审批流程,特别是涉及二级审批的场景。这个压缩包文件包含了一个...

    设计模式精解-GoF 23种设计模式解析附C++.pdf

    ### 设计模式精解——GoF 23种设计模式解析及C++实现 #### 0. 引言 设计模式作为面向对象编程的核心组成部分,是软件开发者在长期实践中总结出来的最佳实践。通过深入理解这些设计模式,我们可以更好地进行面向...

    JAVA-设计模式-行为型模式-状态模式

    JAVA-设计模式-行为型模式-状态模式

    java 设计模式之状态模式

    状态模式是一种行为设计模式,它允许对象在内部状态改变时改变其行为,看起来好像对象改变了它的类。在Java中,状态模式通常通过定义不同的状态类和一个上下文类来实现,其中上下文类持有状态对象并调用其方法来响应...

    java设计模式---诙谐易懂版

    根据给定文件内容,以下是关于Java设计模式的知识点说明: 1. 策略模式(Strategy Pattern)是一种行为设计模式,允许在运行时选择算法的行为。策略模式的意图是定义一系列算法,将每个算法封装起来,并使它们可以...

    设计模式精解-GoF 23种设计模式解析附C++实现源码.pdf

    ### 设计模式精解——GoF 23种设计模式解析及C++实现源码 #### 0. 引言 设计模式是软件工程领域的一个重要概念,它提供了一种解决常见问题的方法论。GoF(Gang of Four)所提出的23种设计模式被视为面向对象设计的...

    设计模式-状态模式分享ppt

    ### 设计模式之状态模式详解 #### 一、设计模式概述 设计模式是软件工程领域的一种最佳实践,它提供了一套解决特定问题的通用方案。根据功能的不同,设计模式大致可以分为三大类:创建型模式、结构型模式以及行为型...

    《设计模式》实战---状态模式(State Pattern)

    状态模式是一种行为设计模式,它使你能在运行时改变对象的行为。在状态模式中,一个对象的状态变化会导致其行为的变化。这种模式常用于处理具有多种状态的对象,且不同状态下对象的行为差异较大。通过将每种状态封装...

    Java设计模式----通俗易懂版

    这个资源"Java设计模式----通俗易懂版"显然是一个专门针对初学者或需要深入理解设计模式的开发者编写的指南。作者以形象生动的例子解释了23种经典的Java设计模式,使得复杂的概念变得更加易于理解。 首先,我们要...

    设计模式课件大全

    PPT内容包括:内附代码,实例,方便理解。 继承、封装、多态、UML ...设计模式15-观察者模式、状态模式 设计模式16-策略模式、模板方法、访问者 此PPT实例便于理解,对于深入理解OO思想有很大帮助。

    java常用设计模式-状态模式

    Java 架构设计模式 - 状态模式和模板模式 在软件设计中,了解设计模式非常重要,它可以帮助开发者编写更好的代码,使得系统更加灵活、可维护和可扩展。今天,我们将讨论两种常用的Java设计模式:状态模式和模板模式...

    设计模式精解-GoF 23种设计模式

    21. **状态模式**:允许对象在其内部状态改变时改变其行为,对象看起来似乎修改了它的类。 22. **策略模式**:定义了一系列算法,并将每一个算法封装起来,使它们可以相互替换,让算法独立于使用它的客户。 23. **...

    c++设计模式-行为型模式-状态模式

    c++设计模式-行为型模式-状态模式;qt工程;c++简单源码; 状态(State)模式的定义:对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为。

    设计模式精解-GoF 23种设计模式解析附C++实现源码 完整版

    《设计模式精解-GoF 23种设计模式解析附C++实现源码 完整版》是一份深入探讨软件工程中经典设计模式的重要资料,涵盖了面向对象编程中的核心设计原则和实践。这份资源主要关注GoF(Gang of Four,即《设计模式:可...

    新版设计模式手册 - C#设计模式(第二版)

    《新版设计模式手册 - C#设计模式(第二版)》是一部深入探讨C#编程中设计模式的权威指南,尤其适合已经有一定C#基础并希望提升软件设计能力的开发者阅读。设计模式是解决软件开发中常见问题的经验总结,是软件工程的...

Global site tag (gtag.js) - Google Analytics