首页 > 其他分享 >设计模式之状态模式

设计模式之状态模式

时间:2023-03-17 16:32:20浏览次数:28  
标签:oldVoteCount 状态 String voteItem 模式 投票 设计模式 public user

前提:含环境类、状态接口、具体状态类。将每个状态实现为一个对象即行为。(ps: 没想到更啥,先更着以前写的状态模式吧。。。。)



 



1 状态接口:


public interface VoteState {








/**




* 处理对应状态的行为




* @param user [投票人]




* @param voteItem [投票项]




* @param voteManager [环境类]




*/



public void vote(String user, String voteItem, VoteManager voteManager);


}



2 具体状态类:



public class NormalVoteState implements VoteState {


@Override


public void vote(String user, String voteItem, VoteManager voteManager) {


//正常投票,记录到投票记录中


voteManager.getMapVote().put(user, voteItem);


System.out.println("恭喜投票成功");


}


}


//----------------------------------------------------------------------------------


public class RepeatVoteState implements VoteState {


@Override


public void vote(String user, String voteItem, VoteManager voteManager) {


//重复投票,暂时不做处理


System.out.println("请不要重复投票");


}


}


//----------------------------------------------------------------------------------


public class SpiteVoteState implements VoteState {


@Override


public void vote(String user, String voteItem, VoteManager voteManager) {


// 恶意投票,取消用户的投票资格,并取消投票记录


String str = voteManager.getMapVote().get(user);


if(str != null){


voteManager.getMapVote().remove(user);


}


System.out.println("你有恶意刷屏行为,取消投票资格");


}


}


//----------------------------------------------------------------------------------


public class BlackVoteState implements VoteState {


@Override


public void vote(String user, String voteItem, VoteManager voteManager) {


//记录黑名单中,禁止登录系统


System.out.println("进入黑名单,将禁止登录和使用本系统");


}


}



3 环境类:



public class VoteManager {







//持有状态处理对象


private VoteState state = null;


//记录用户投票的结果,Map<String,String>对应Map<用户名称,投票的选项>


private Map<String,String> mapVote = new HashMap<>();


//记录用户投票次数,Map<String,Integer>对应Map<用户名称,投票的次数>


private Map<String,Integer> mapVoteCount = new HashMap<>();



/**




* 获取用户投票结果的Map




*/



public Map<String, String> getMapVote() {


return mapVote;


}



/**




* 投票




* @param user 投票人




* @param voteItem 投票的选项




*/



public void vote(String user,String voteItem){


//1.为该用户增加投票次数


//从记录中取出该用户已有的投票次数


Integer oldVoteCount = mapVoteCount.get(user);


if(oldVoteCount == null){


oldVoteCount = 0;


}


oldVoteCount += 1;


mapVoteCount.put(user, oldVoteCount);


//2.判断该用户的投票类型,就相当于判断对应的状态


//到底是正常投票、重复投票、恶意投票还是上黑名单的状态


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);


}


}



 



4 用法:


public static void main(String[] args) {


VoteManager vm = new VoteManager();


for(int i=0;i<9;i++){


vm.vote("u1","A");


}


}


 



 

标签:oldVoteCount,状态,String,voteItem,模式,投票,设计模式,public,user
From: https://blog.51cto.com/u_13854513/6127522

相关文章

  • 设计模式之适配器模式
    前提:适配器模式有三种-类、对象、接口适配器。(暂时没想到更啥,先更着以前写的适配器模式吧。。。)使用场景:假设手上有一个ps2插头的设备,但主机对外是usb,这时候需要弄个......
  • 单例代理模式之懒汉模式
    /***@Nyapii*/publicclassSingleTon1{//这是饿汉,我饿怕了,不论在什么情况下,我都要一个属于我的汉堡publicstaticvoidmain(String[]args){......
  • python __new__方法与单例模式
    1、new()至少要有一个参数cls,代表当前类,此参数在实例时由python解释器自动识别,2、new()必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意,可以......
  • uniapp小程序工厂模式示例
    //appBusinessHandle.jsconstdoSomeThing=()=>{...}/*小程序启动时需要处理的个性逻辑*/constonLaunchHandle={}/*小程序显示时需要处理的个性逻辑*/constonS......
  • IDEA经常出现假死状态 - 排查解决
    最近使用IDEA过程中,时不时的出现假死的情况,观察cpu和内存均有余量,为了避免重启IDEA,还是花了些时间排查原因。使用jvisualvm观察IDEA进程cpu、堆内存、线程信息等,发现提示......
  • 代理模式
    动态代理动态的生成代理对象,对满足条件的目标对象皆可以生成代理代理对象,没有静态代理一个目标类一个代理类的问题解耦合 JDK动态代理需要目标类有实现接口代理类与......
  • 观察者模式和发布订阅模式
    首先我们必须清楚这两种模式都是设计模式,而不是某种语言的专属;观察者模式(Observer)概念理解观察者模式是一种一对多的依赖关系的行为设计模式,让多个观察者对象监听一......
  • 设计模式——享元模式
    个人理解:抽离公共方法所需的属性进行共享;不需要的字段抽离到外面进行管理。1、享元模式享元模式(FlyweightPattern)主要用于减少创建对象的数量,以减少内存占用和提高性能......
  • Nginx负载均衡的三种模式
    1、轮询模式轮询模式是根据访问时间,之一分配到不同的后端服务器,并且后端服务器如果down掉了,Nginx还会自动剔除这个失效的地址,适合服务器配置相当,无状态且短平快的服务......
  • 设计模式5——模板方法模式
    1、定义模板方法模式由两部分结构组成,第一部分是抽象父类,第二部分是具体的实现子类。2、核心在抽象父类中封装子类的算法框架,它的init方法可作为一个算法的模板,指导子......