十二、状态模式——设计模式学习笔记
来源:互联网 发布:淘宝卖点文案 编辑:程序博客网 时间: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点,扛不住了要睡了
阅读全文
1 0
- 十二、状态模式——设计模式学习笔记
- 大话设计模式学习(十二)——状态模式
- 设计模式(十二)——状态模式
- 设计模式—状态模式(十二)
- 设计模式学习笔记二十二(State状态模式)
- 设计模式学习笔记(二十二)——State状态
- 设计模式学习笔记(十二)—Builder建造者模式
- 设计模式学习笔记十二:访问者模式
- 学习笔记(十二)—设计模式(续)
- HeadFirst 设计模式学习笔记11——状态模式
- 设计模式学习笔记——状态模式
- 《Head First 设计模式》学习笔记——状态模式
- 设计模式学习笔记——状态模式
- 设计模式学习笔记——状态模式
- 设计模式学习笔记——State状态模式
- 设计模式学习笔记——状态(State)模式框架
- 学习笔记——JAVA设计模式<20>状态模式
- 设计模式笔记(十二) —— 适配器模式
- 游戏编程入门(9):开发 Henway(小鸡过马路) 游戏
- Eclipse快捷键大全
- 项目二:爬取网页图片
- 二叉排序树
- BZOJ 1820 DP 解题报告
- 十二、状态模式——设计模式学习笔记
- msys2修改用户名和主目录
- 删数问题(典型的贪心算法问题)
- Hadoop2.6.4集群安装配置
- [NOIP2015]day1题解集合
- 11.mac 各种服务
- 洛谷P1948 [USACO08JAN]电话线Telephone Lines
- Servlet学习笔记1-基本知识点,和servlet的理解
- Tensorflow 1.2+Ubuntu 16.04+Cuda 8.0+cuDNN 5.1配置流程