一、定义:
当一个对象的内在状态发生变化时线性改变其行为。这个对象看起来像是改变了其类。
二、UML图:
三、组成:
1、上下文Context:维护以个具体状态的实例,这个实例维护当前的状态。
2、State 抽象状态类:定义一个接口来封装与Context的一个特定状态相关的行为。
3、ConcreteState具体状态:每个子类实现一个与Context状态相关的行为。
四、通用代码:
1、Context:
package 状态模式通用;
public class Context {
State s;
public void request() {
s.handle(this);
}
public void setS(State s) {
this.s=s;
}
}
2、State 抽象状态类:
package 状态模式通用;
public abstract class State {
public abstract void handle(Context c);
}
3、具体状态类 Concrete1、2、3:
package 状态模式通用;
public class ConcreteState1 extends State {
@Override
public void handle(Context c) {
System.out.println("目前状态1,正在转向状态2!");
c.setS(new ConcreteState2());
c.request();
}
}
public class ConcreteState2 extends State {
@Override
public void handle(Context c) {
System.out.println("目前转移到状态2,正在转向状态3!");
c.setS(new ConcreteState3());
c.request();
}
}
public class ConcreteState3 extends State {
@Override
public void handle(Context c) {
System.out.println("已到达状态3,状态转移结束!");
}
}
4、场景类;
package 状态模式通用;
public class Client {
public static void main(String[] args) {
Context c=new Context();
c.setS(new ConcreteState1());
c.request();
}
}
五、具体实例:
1、小菜一天的工作状态:
代码实现:
①、抽象状态类以及具体状态类:
public abstract class State {
public abstract void writeProgram(Work w);
}
public class MorningState extends State {
@Override
public void writeProgram(Work w) {
if(w.isTaskFinished()) {
w.setState(new RestState());
w.writeProgram();
}else {
if(w.getTime()<11) {
System.out.println("当前时间"+w.getTime()+":00"+"上午精力充沛,加油工作!");
}else {
w.setState(new AfternoonState());
w.writeProgram();
}
}
}
}
public class AfternoonState extends State {
@Override
public void writeProgram(Work w) {
if(w.isTaskFinished()) {
w.setState(new RestState());
w.writeProgram();
}else {
if(w.getTime()<15) {
System.out.println("当前时间"+w.getTime()+":00"+"中午吃完饭下午有点类,但还要努力工作!");
}else {
w.setState(new EveningState());
w.writeProgram();
}
}
}
}
public class EveningState extends State {
@Override
public void writeProgram(Work w) {
if(w.isTaskFinished()) {
w.setState(new RestState());
w.writeProgram();
}else {
if(w.getTime()<20) {
System.out.println("当前时间"+w.getTime()+":00"+"晚上任务快完不成了,再加把劲!");
}else {
w.setState(new SleepingState());
w.writeProgram();
}
}
}
}
public class SleepingState extends State {
@Override
public void writeProgram(Work w) {
System.out.println("都"+w.getTime()+":00点了,抓紧时间离开办公室回去睡觉了!");
}
}
public class RestState extends State {
@Override
public void writeProgram(Work w) {
System.out.println("当前时间"+w.getTime()+":00"+"任务都完成了,可以放松了");
}
}
②工作类(Context):
package 小菜一天的工作状态;
public class Work {
private State state=null;
private int time=0;
private boolean taskFinished=false;
public void setState(State state) {
this.state=state;
}
public void writeProgram() {
state.writeProgram(this);
}
public int getTime() {
return time;
}
public void setTime(int time) {
this.time = time;
}
public boolean isTaskFinished() {
return taskFinished;
}
public void setTaskFinished(boolean taskFinished) {
this.taskFinished = taskFinished;
}
}
③、客户端:
package 小菜一天的工作状态;
public class Client {
public static void main(String[] args) {
Work w=new Work();
w.setState(new MorningState());//初始化工作状态
/*每隔一段时间查看一下小菜的工作状态:*/
w.setTime(6);
w.writeProgram();
w.setTime(9);
w.writeProgram();
w.setTime(11);
w.writeProgram();
w.setTime(14);
w.writeProgram();
w.setTime(18);
w.writeProgram();
//w.setTaskFinished(true);
w.setTime(19);
w.writeProgram();
w.setTime(22);
w.writeProgram();
}
}
2、在线投票(疑问?状态转移为嘛放在了上下文中)???????????不是很懂。
①上下文:投票管理者:
package 在线投票;
//Context
import java.util.HashMap;
import java.util.Map;
public class VoteManger {
private State state=null;
private Map<String, String>votePerson=null;
private Map<String,Integer>voteCount=null;
public VoteManger() {
votePerson=new HashMap<String, String>();
voteCount=new HashMap<String, Integer>();
}
public void vote(String user,String person) {
Integer count=voteCount.get(user);
if(count==null) {
count=0;
}
count++;
voteCount.put(user, count);
switch(count) {
case 1:
state=new NormalVestState();
break;//正常投票↑
case 2:
case 3:
case 4:
case 5:
state=new RepeatState();
break;//多次投票↑
case 6:
case 7:
case 8:
state=new SpiteVoteState();
break;//恶意投票取消投票结果↑
default:
state=new BlackVoteState();
break;//拉入黑名单↑
}
state.vote(user, person, this);
}
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
public Map<String,Integer> getVoteCount() {
return voteCount;
}
public void setVoteCount(Map<String,Integer> voteCount) {
this.voteCount = voteCount;
}
public Map<String, String> getVotePerson() {
return votePerson;
}
public void setVotePerson(Map<String, String> votePerson) {
this.votePerson = votePerson;
}
}
②抽象状态类&&具体状态类(正常投票、重复投票、取消投票资格、拉入黑名单四种状态):
package 在线投票;
public abstract class State {
public abstract void vote(String user,String person,VoteManger vm);//用户、被选举人、this投票管理者
}
public class NormalVestState extends State{
@Override
public void vote(String user, String person, VoteManger vm) {
System.out.println("投票成功!");
vm.getVotePerson().put(user, person);//投票成功,投票人以及被投票人信息加入集合1中
}
}
public class RepeatState extends State {
@Override
public void vote(String user, String person, VoteManger vm) {
System.out.println("已投过一票,请不要多次投票!");//重复投票,给出提示信息,投票次数依然累加,投票信息不变
//vm.getVotePerson().put(user,person);
}
}
public class SpiteVoteState extends State {
@Override
public void vote(String user, String person, VoteManger vm) {
String per=vm.getVotePerson().get(user);
if(per!=null) {//没有该用户,说明已经被取消投票资格
vm.getVotePerson().remove(user);//达到5次限制,集合1中移除该用户,计数器依然累加
}
System.out.println("投票满5次,取消投票资格!");
}
}
public class BlackVoteState extends State {
@Override
public void vote(String user, String person, VoteManger vm) {
System.out.println("投票满8次,已被拉入黑名单!");//直接拉入黑名单
}
}
③客户端:
package 在线投票;
public class Client {
public static void main(String[] args) {
VoteManger vm=new VoteManger();
for(int i=1;i<=10;++i) {
System.out.print("第"+i+"次投票:");
vm.vote("小王", "xx领导人");
}
}
}
运行结果;
3、请假流程:
某人提出请假申请,先由项目经理审批,如果项目经理不同意,审批就直接结束
如项目经理同意,再看是否超过3天,如果三天以内,审批直接结束
否则,交给部门经理,部门经理审核后,无论是否同意,审批直接结束
自己分析:2/3种审批状态:项目经理状态、部门经理状态、(审批结束状态true/false)。
上下文:
package 请假流程;
public class Context {
private State state=null;
private int days=0;
public Context() {
this.state=new ProjectMangerState();
}
public void qingJia() {
state.qingJia(this);
}
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
public int getDays() {
return days;
}
public void setDays(int days) {
this.days = days;
}
}
抽象状态类&&具体状态类:
package 请假流程;
public abstract class State {
public abstract void qingJia(Context c);
}
public class ProjectMangerState extends State {
@Override
public void qingJia(Context c) {
if(c.getDays()<=3) {
System.out.println("请假时间3天之内,项目经理请假成功,流程结束!");
}else {
System.out.println("请假时间超过3天,去找部门经理!");
c.setState(new PartmentManagerState());
c.qingJia();
}
}
}
public class PartmentManagerState extends State {
@Override
public void qingJia(Context c) {
System.out.println("管部门经理同不同意,审批结束!");
}
}
客户端:
package 请假流程;
public class Client {
public static void main(String[] args) {
Context c=new Context();
c.setDays(2);//三天之内,由项目经理处理即可
//c.setDays(5); 请假时间超过三天,由部门经理处理;
c.qingJia();
}
}
The end;