博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
State pattern-状态模式
阅读量:6472 次
发布时间:2019-06-23

本文共 1462 字,大约阅读时间需要 4 分钟。

解决问题

主要解决由于状态不同而导致对象行为发生复杂变化(特别是多种行为发生变化),这时候如果仅通过if来处理,会使代码复杂度不可控。我们保以认为strategy模式更多的是解决不同状态下,单行为的变化;而state-pattern则是解决不同状态下多行为的变化。

应用场景

如果一个对象在不同的状态下,需要表现出不同的行为,这时候我们可以采用状态模式。一个非常经典的应用场景是状态机,它可以很好地描述状态机的变化;例如我们经常学到的电梯控制逻辑。

原理图

State:状态接口,定义多种行为接口,当然也可以处理一种行为,如上原理图

  • ContreteSate:不同状态下的行为表现方式

  • Context:上下文,我们这里可以理解为为状态变化控制条件。

示例

以以下背景为例:

工人一日三餐,餐餐不同。

public interface MealState {    public void drink();    public void eat();}public class BreakfastState implements MealState {    public void drink() {        System.out.println("drink milk");    }    public void eat() {        System.out.println("eat bread");    }}public class LunchState implements MealState {    public void drink() {        System.out.println("drink juice");    }    public void eat() {        System.out.println("eat noodle");    }}public class DinnerState implements MealState {    public void drink() {        System.out.println("drink wine");    }    public void eat() {        System.out.println("eat Steak");    }}@AllArgsConstructorpublic class Worker {    @Setter    private MealState state;    public void haveAMeal() {        state.drink();        state.eat();    }    public static void main() {        Worker context = new Worker(new BreakfastState());        context.haveAMeal();        context.setState(new LunchState());        context.haveAMeal();        context.setState(new DinnerState());        context.haveAMeal();    }}复制代码

参考

https://en.wikipedia.org/wiki/State_pattern

转载地址:http://jovko.baihongyu.com/

你可能感兴趣的文章
css布局 - 九宫格布局的方法汇总(更新中...)
查看>>
画图函数——点,线,矩形等等
查看>>
ejabberd_local
查看>>
BZOJ5020 [THUWC 2017]在美妙的数学王国中畅游LCT
查看>>
hdu 6030 矩阵快速幂
查看>>
tomcat类加载机制
查看>>
ado.net2.0中的缓存使用SqlDependency类
查看>>
Java基础学习总结(94)——Java线程再学习
查看>>
iOS开发之调用系统设置
查看>>
利用 ACPI\\ACPI0003设备 判断笔记本还是台式机
查看>>
解决wampserver 服务无法启动
查看>>
ES6中Promise封装ajax的写法
查看>>
初次使用 VUX
查看>>
javascript 字符串转数字的简便写法
查看>>
0404《构建之法》第四章读后感
查看>>
html之div始终停留在屏幕中间部分
查看>>
AsyncTask的缺陷
查看>>
Spring中jdbcTemplate的用户实例
查看>>
[模板] 快速傅里叶变换/FFT/NTT
查看>>
DecimalFormat 数据格式设置 SimpleDateFormat时间格式的用法介绍 --转载
查看>>