设计模式之状态模式

来源:互联网 发布:营口港大数据平台 编辑:程序博客网 时间:2024/06/06 14:21

定义

允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。还没有明显感觉出和策略模式有什么本质区别。书上给出的时一个是可替换的,另一个不可替换,下次再研究下。

使用场景

考虑一个在线投票系统的应用,实现一个用户只能投一票,如果一个用户反复投票,而且投票次数超过5次,则判定为恶意投票,取消该用户的投票资格,当然要取消该用户所投的票,如果一个用户投票的次数超过8次,加入黑名单,禁止再登陆和使用系统。

代码

状态接口

package state;import java.util.HashMap;import java.util.Map;public interface  State {    //public void vote(String user, String voteItem);//这里需要用到上下文内容    public void vote(String user, String voteItem, Context context)}

具体的状态

package state;public class NormalState implements  State {    @Override    public void vote(String user, String voteItem, Context context) {        // TODO 自动生成的方法存根        System.out.println("正常投票");    }}package state;public class RepeateState implements State {    @Override    public void vote(String user, String voteItem, Context context) {        // TODO 自动生成的方法存根        System.out.println("请不要重复投票");    }}package state;public class EvilState implements State {    @Override    public void vote(String user, String voteItem, Context context) {        // TODO 自动生成的方法存根        String s = context.getSmap().get(user);        if (s != null)        {            context.getSmap().remove(user);        }        System.out.println("您有恶意刷票行为,取消资格");    }}package state;public class BlackState implements State {    @Override    public void vote(String user, String voteItem,Context ct) {        // TODO 自动生成的方法存根        System.out.println("加入黑名单,将禁止登陆和使用本系统");    }}

上下文定义:

package state;import java.util.HashMap;import java.util.Map;public class Context {    private State state;    //投票人 投票内容(“A”)    private  Map<String,String> sMap = new HashMap<>();    //投票人,偷票次数    private  Map<String,Integer> iMap = new HashMap<>();    public Map<String,String> getSmap()    {        return sMap;    }    public   void handle(String user,String voteItem) {        //System.out.println("Hello world");        //这里将Integer写成int回报空指针异常错误        Integer count = iMap.get(user);        if (count == null)        {            count = 0;        }        count++;        iMap.put(user, count);        if (count == 1)        {            state = new NormalState();        }        else if (count > 1 && count < 5 )        {            state = new RepeateState();        }        else if (count >=  5  && count <= 8)        {                state =  new EvilState();        }        else if (count >=  8)        {            state = new BlackState();        }        state.vote(user,voteItem,this);    }}

客户端测试:

package state;public class Client {    public static void main(String[] args)    {        Context  ct= new Context();        for (int i = 0;i < 9;i++)        {            ct.handle("小李", "A");        }    }}

运行结果:
正常投票
请不要重复投票
请不要重复投票
请不要重复投票
您有恶意刷票行为,取消资格
您有恶意刷票行为,取消资格
您有恶意刷票行为,取消资格
您有恶意刷票行为,取消资格
加入黑名单,将禁止登陆和使用本系统

原创粉丝点击