十二、状态模式——设计模式学习笔记

来源:互联网 发布:淘宝卖点文案 编辑:程序博客网 时间:2024/06/13 04:26
作为一个编程菜鸟,过去在学习设计模式的时候,老师给推荐了一本《大话设计模式》。阅读以后受益匪浅,可惜当初没有坚持看完。最近有时间了,又重新捡起来学习了一遍,整理了一下笔记,由于本人能力有限,欢迎大家批评指正。

1.状态模式 State Pattern

  • 状态模式,当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
  • 状态模式主要解决的是当控制一个对象状态转换条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。

2.uml类图

这里写图片描述

3.组成

(1)State类

抽象状态类,定义一个接口以封装与Context的一个特定状态相关的行为。

(2)ConcreteState类

具体状态,每一个子类实现一个与Context的一个状态相关的行为。

(3)Context

维护一个ConcreteState子类的实例,这个实例定义当前的状态。

4.优点

  • 状态模式通过把各种状态转移逻辑分布到State的子类之间,将不同状态的行为分割开来,即将与特定状态相关的行为局部化,减少了相互间的依赖。
  • 将特定的状态相关的行为都放入一个对象中,由于所有与状态相关的代码都存在于某个ConcreteState中,所以通过定义新的子类可以很容易地增加新的状态和转换。

5.适用场景

  • 一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。。
  • 一个操作中含有庞大的多分支结构,并且这些分支决定于对象的状态。

6.实例

(1)需求

程序员一天的工作状态,若下午六点前完成工作可以下班回家。

(2).uml类图

这里写图片描述

(3)代码

a.工作类
package com.longinus.sp;public class Work {    private State current;    private int hour;    private boolean isFinish;    public Work() {        // TODO Auto-generated constructor stub        current = new ForenoonState();    }    public State getCurrent() {        return current;    }    public void setCurrent(State current) {        this.current = current;    }    public int getHour() {        return hour;    }    public void setHour(int hour) {        this.hour = hour;    }    public boolean isFinish() {        return isFinish;    }    public void setFinish(boolean isFinish) {        this.isFinish = isFinish;    }    public void writeProgram(){        current.writeProgram(this);    }}
b.抽象状态类
package com.longinus.sp;public abstract class State {    public abstract void writeProgram(Work work);}
c.具体状态类
package com.longinus.sp;public class ForenoonState extends State {    @Override    public void writeProgram(Work work) {        // TODO Auto-generated method stub        if(work.getHour() < 12){            System.out.println("现在是" + work.getHour() + "点,精神满满");        } else {            work.setCurrent(new NoonState());            work.writeProgram();        }    }}
package com.longinus.sp;public class NoonState extends State {    @Override    public void writeProgram(Work work) {        // TODO Auto-generated method stub        if(work.getHour() < 14){            System.out.println("现在是" + work.getHour() + "点,是时候吃饭了");        } else {            work.setCurrent(new AfternoonState());            work.writeProgram();        }    }}
package com.longinus.sp;public class AfternoonState extends State {    @Override    public void writeProgram(Work work) {        // TODO Auto-generated method stub        if(work.getHour() < 18){            System.out.println("现在是" + work.getHour() + "点,没睡午觉,感到犯困");        } else {            work.setCurrent(new EveningState());            work.writeProgram();        }    }}
package com.longinus.sp;public class EveningState extends State {    @Override    public void writeProgram(Work work) {        // TODO Auto-generated method stub        if(work.isFinish()){            work.setCurrent(new RestState());            work.writeProgram();        } else if(work.getHour() < 22){            System.out.println("现在是" + work.getHour() + "点,加班奋战");        } else {            work.setCurrent(new SleepingState());            work.writeProgram();        }    }}
package com.longinus.sp;public class SleepingState extends State {    @Override    public void writeProgram(Work work) {        // TODO Auto-generated method stub        System.out.println("现在是" + work.getHour() + "点,扛不住了要睡了");    }}
package com.longinus.sp;public class RestState extends State {    @Override    public void writeProgram(Work work) {        // TODO Auto-generated method stub        System.out.println("现在是" + work.getHour() + "点,完成任务,收工回家");    }}
d.测试类
package com.longinus.sp;public class Test {    public static void main(String[] args) {        // TODO Auto-generated method stub        Work work = new Work();        work.setHour(9);        work.writeProgram();        work.setHour(12);        work.writeProgram();        work.setHour(14);        work.writeProgram();        work.setHour(19);        work.writeProgram();        work.setHour(22);        work.writeProgram();    }}
e.输出结果
现在是9点,精神满满现在是12点,是时候吃饭了现在是14点,没睡午觉,感到犯困现在是19点,加班奋战现在是22点,扛不住了要睡了
原创粉丝点击