JAVA开发的23种设计模式之 --- 状态模式
来源:互联网 发布:知乎问题 编辑:程序博客网 时间:2024/06/14 19:16
状态模式
- 概述:允许一个对象在其内部状态改变时改变他的行为.对象看起来似乎修改了它的类
- 帮助理解:可以将状态模式的场景理解为QQ的状态,不同的状态对于他的QQ好友来说,行为是不一样的.例如:隐身状态对于好友来说不可见.总结下来状态模式就有两个要点:1.可以通过改变状态来获得不同的行为.2.对象看起来有所变化(在例子中可以理解为,你的好友可以看到你的变化)
- 使用场景:对象的行为依赖于他的状态.并且可以根据它的状态改变而改变相应的行为.
- 状态模式所包含的角色
- Context : 上下文环境类,他维护了一个具体状态对象,并将与状态相关的操作委托给当前的具体状态对象来处理
- State : 抽象状态.定义一个抽象方法来封装使用上下文环境中的一个特定状态相关的行为.
- ConcreteState : 具体状态.实现抽象类定义的抽象方法.
- 优点
- 封装了转换规则
- 将所有与某个状态有关的行为放到一个类中.并且可以方便的增加新的状态.这样只需要改变对象的状态就可改变对象的行为
- 缺点
- 会增加系统类和对象的个数
- 状态模式的结构和实现会比较复杂,使用不当的话会导致结构和代码混乱
代码实现
示例:根据QQ状态(在线,隐身等),以及不同状态下的不同行为.使用状态模式演示这一场景.
上下文环境类
package State;/** * Created by looper on 2017/8/24. */public class Context { private State state; public Context(State state){ this.state = state; } public State getState() { return state; } public void setState(State state) { this.state = state; System.out.print("当前状态是 :"+state.getStateName()); if(StateName.CLOAKING.equals(state.getStateName())){ System.out.println(" 对好友不可见."); }else{ System.out.println(" 对好友可见."); } } public void changeState(){ this.state.changeState(this); }}
状态枚举类
package State;/** * Created by looper on 2017/8/24. */public enum StateName { //隐身状态,在线状态 CLOAKING,ONLINE; @Override public String toString(){ return this.name(); }}抽象状态类
package State;/** * Created by looper on 2017/8/24. */public abstract class State { private StateName stateName; public abstract void changeState(Context context); public State(StateName stateName){ this.stateName = stateName; } public StateName getStateName() { return stateName; } public void setStateName(StateName stateName) { this.stateName = stateName; }}具体状态类(在线状态)
package State;/** * Created by looper on 2017/8/24. */public class OnlineState extends State { public OnlineState(StateName stateName) { super(stateName); } @Override public void changeState(Context context) { //转换为隐身状态 context.setState(new CloakingState(StateName.CLOAKING)); }}具体状态类(隐身状态)
package State;/** * Created by looper on 2017/8/24. */public class CloakingState extends State { public CloakingState(StateName stateName) { super(stateName); } @Override public void changeState(Context context) { //转换为在线状态 context.setState(new OnlineState(StateName.ONLINE)); }}测试类
package State;/** * Created by looper on 2017/8/24. */public class StateTest { public static void main(String[] args) { //初始状态 为 在线状态 Context context = new Context(new OnlineState(StateName.ONLINE)); context.changeState(); context.changeState(); }}
输出:
我将23种设计模式的全部代码上传到CSDN,有用得到的同学 可以去下载.
下载地址 : 点我
阅读全文
1 0
- JAVA开发的23种设计模式之 --- 状态模式
- JAVA开发的23种设计模式之 --- 外观模式
- JAVA开发的23种设计模式之 --- 策略模式
- JAVA开发的23种设计模式之 --- 模板模式
- JAVA开发的23种设计模式之 --- 观察者模式
- JAVA开发的23种设计模式之 --- 命令模式
- JAVA开发的23种设计模式之 --- 备忘录模式
- JAVA开发的23种设计模式之 --- 访问者模式
- Java开发中的23种设计模式之二十:状态模式(State)
- 23种设计模式之状态模式
- java设计模式之状态设计模式
- 深入浅出Java设计模式之状态模式
- Java设计模式之State(状态模式)
- java设计模式之状态 模式State
- java设计模式之状态模式
- Java 设计模式之状态模式
- java与设计模式之状态模式
- Java设计模式泛型化之状态模式
- UVA-129 困难的串
- 打印1到最大的n位数
- 深度学习统计学基础
- 【PAT】【Advanced Level】1069. The Black Hole of Numbers (20)
- 谷歌正式发布Android 8.0,TestBird支持Android Oreo测试
- JAVA开发的23种设计模式之 --- 状态模式
- Android中解析不规则json的理解(基于Gson)
- navigationview的样式设置
- 记录一下关于编码的问题
- SequoiaDB巨杉数据库大对象块存储原理与应用
- PAT甲级1002. A+B for Polynomials (25)
- maven学习笔记:命令行模式创建scala_spark项目并运行程序
- iframe 高度自适应,并且子页面的高度不断变化
- Java处理csv文件