美文网首页
设计模式---状态模式

设计模式---状态模式

作者: _非_阳_ | 来源:发表于2019-03-25 15:41 被阅读0次
UML图

其实状态模式和策略模式在UML结构上是一样的,只是侧重点不同

State接口

package com.mjt.learning.pattern.state.demo1;

/**
 * Copyright:Learning
 * Author: liyang <br>
 * Date:2019/3/25 3:05 PM<br>
 * Desc: 状态模式下状态接口<br>
 */
public interface State {
    void run();
}

BadState实现

package com.mjt.learning.pattern.state.demo1;

/**
 * Copyright:Learning
 * Author: liyang <br>
 * Date:2019/3/25 3:08 PM<br>
 * Desc: <br>
 */
public class BadState implements State {
    @Override
    public void run() {
        System.out.println("今天马拉松用时4小时!");
    }
}

NormalState实现

package com.mjt.learning.pattern.state.demo1;

/**
 * Copyright:Learning
 * Author: liyang <br>
 * Date:2019/3/25 3:06 PM<br>
 * Desc: <br>
 */
public class NormalState implements State{
    @Override
    public void run() {
        System.out.println("今天马拉松用时5小时!");
    }
}

GoodState实现

package com.mjt.learning.pattern.state.demo1;

/**
 * Copyright:Learning
 * Author: liyang <br>
 * Date:2019/3/25 3:08 PM<br>
 * Desc: <br>
 */
public class GoodState implements State {
    @Override
    public void run() {
        System.out.println("今天马拉松用时3小时!");
    }
}

Runner 相当于Context

package com.mjt.learning.pattern.state.demo1;

/**
 * Copyright:Learning
 * Author: liyang <br>
 * Date:2019/3/25 3:08 PM<br>
 * Desc: <br>
 */
public class Runner {
    private State state = new NormalState();

    public void setState(State state) {
        this.state = state;
    }

    public void run() {
        state.run();
    }

    public static void main(String[] args) {
        Runner runner =new Runner();
        runner.run();//正常状态

        runner.setState(new BadState());
        runner.run();

        runner.setState(new GoodState());
        runner.run();

    }
}

进阶

投票问题

VoteState接口

package com.mjt.learning.pattern.state.demo2;

/**
 * Copyright:Learning
 * Author: liyang <br>
 * Date:2019/3/25 5:26 PM<br>
 * Desc: <br>
 */
public interface VoteState {
    void vote(String user,String voteItem,VoteManager vm);
}

NormalVoteState 正常投票状态

package com.mjt.learning.pattern.state.demo2;

/**
 * Copyright:Learning
 * Author: liyang <br>
 * Date:2019/3/25 5:28 PM<br>
 * Desc: <br>
 */
public class NormalVoteState implements VoteState{
    @Override
    public void vote(String user, String voteItem, VoteManager vm) {
        vm.getVoteResults().put(user,voteItem);
        System.out.println("恭喜投票成功!");
    }
}

RepeatVoteState重复投票状态

package com.mjt.learning.pattern.state.demo2;

/**
 * Copyright:Learning
 * Author: liyang <br>
 * Date:2019/3/25 5:39 PM<br>
 * Desc: <br>
 */
public class RepeatVoteState implements VoteState{
    @Override
    public void vote(String user, String voteItem, VoteManager vm) {
        System.out.println("请不要重复投票!");
    }
}

SpiteVoteState 恶意刷票状态

package com.mjt.learning.pattern.state.demo2;

/**
 * Copyright:Learning
 * Author: liyang <br>
 * Date:2019/3/25 5:39 PM<br>
 * Desc: <br>
 */
public class SpiteVoteState implements VoteState {
    @Override
    public void vote(String user, String voteItem, VoteManager vm) {
        String s = vm.getVoteResults().get(user);
        if (s!=null){
            vm.getVoteResults().remove(user);
        }
        System.out.println("您有恶意刷票行为,取消投票结果!");
    }
}

BlackVoteState 拉入黑名单状态

package com.mjt.learning.pattern.state.demo2;

/**
 * Copyright:Learning
 * Author: liyang <br>
 * Date:2019/3/25 5:40 PM<br>
 * Desc: <br>
 */
public class BlackVoteState implements VoteState {
    @Override
    public void vote(String user, String voteItem, VoteManager vm) {
        System.out.println("进入黑名单,将禁止登陆和使用系统!");
    }
}

VoteManager 投票管理

package com.mjt.learning.pattern.state.demo2;

import java.util.HashMap;
import java.util.Map;

/**
 * Copyright:Learning
 * Author: liyang <br>
 * Date:2019/3/25 5:27 PM<br>
 * Desc: <br>
 */
class VoteManager {
    //持有状态处理对象
    private VoteState state = null;

    //记录用户投票结果 <用户姓名,投票的选项>
    private Map<String, String> voteResults = new HashMap<>();

    //记录用户投票次数<用户姓名,投票的次数>
    private Map<String, Integer> voteCounts = new HashMap<>();

    public Map<String, String> getVoteResults() {
        return voteResults;
    }

    public void vote(String user, String voteItem) {
        Integer oldVoteCount = voteCounts.get(user);
        if (oldVoteCount == null) {
            oldVoteCount = 0;
        }
        oldVoteCount += 1;
        voteCounts.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 static void main(String[] args) {
        VoteManager vm=new VoteManager();
        for (int i = 0; i < 9; i++) {
            vm.vote("hanfei","A");
        }
    }
}

输出结果:
为恭喜投票成功!
请不要重复投票!
请不要重复投票!
请不要重复投票!
请不要重复投票!
您有恶意刷票行为,取消投票结果!
您有恶意刷票行为,取消投票结果!
进入黑名单,将禁止登陆和使用系统!
进入黑名单,将禁止登陆和使用系统!

相关文章

  • 设计模式-状态模式

    设计模式-状态模式 设计模式 状态模式的关键是区分事物内部的状态

  • 设计模式——状态模式

    设计模式——状态模式 在状态模式中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。 优点: 减少...

  • 设计模式-状态设计模式

    1.定义 对于某个操作,由于其状态的不同,表现出的行为会不同(如遥控器进行音量增加的操作,在电视是开机状态下是可以...

  • 设计模式——状态模式

    前言 设计模式是指导一个程序猿以更好的姿态处理一些问题,而不再像刚学编程的我们,只会使用if-else分支语句,或...

  • 设计模式--状态模式

    基本常识:策略模式与状态模式是双胞胎,在出生时才分开。 假设公司有个糖果机,1当糖果机由糖果,投入25分钱,转动曲...

  • 设计模式——状态模式

    在阎宏博士的《JAVA与模式》一书中开头是这样描述状态(State)模式的:状态模式,又称状态对象模式(Patte...

  • 设计模式《状态模式》

    引言   上一节我们说了策略模式。这一节我们讲讲策略模式的双胞胎弟弟:状态模式,这个模式大家可能不常见,也不常用,...

  • 设计模式——状态模式

    定义 状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行...

  • 设计模式 - 状态模式

    模式定义 允许一个对象在其内部状态发生改变时改变它的行为。对象看起来似乎修改了它的类。 状态模式(State Pa...

  • 设计模式 ——— 状态模式

    STATE(状态) ———— 对象行为型模式 意图 允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改...

网友评论

      本文标题:设计模式---状态模式

      本文链接:https://www.haomeiwen.com/subject/ggfbvqtx.html