本文源码:GitHub·点这里 || GitEE·点这里

一、生活场景

1、场景描述

变色龙是爬行动物,是非常奇特的动物,它有适于树栖生活的种种特征和行为,身体也会随着环境的变化而变化出适应环境的颜色,非常神奇。下面基于状态模式对该变化过程进行描述。

2、代码实现

public class C01_InScene {
public static void main(String[] args) {
Chameleon chameleon = new Chameleon("红色","花丛环境") ;
LifeContext lifeContext = new LifeContext() ;
// 树叶环境
BodyColor bodyColor = new GreenColor ();
lifeContext.setBodyColor(bodyColor);
lifeContext.change(chameleon);
// 树枝环境
bodyColor = new GrayColor() ;
lifeContext.setBodyColor(bodyColor);
lifeContext.change(chameleon);
}
}
/**
* 变色龙
*/
class Chameleon {
public String color ;
public String contextDesc ;
public Chameleon(String color, String contextDesc) {
this.color = color;
this.contextDesc = contextDesc;
}
}
/**
* 变色龙生存环境
*/
class LifeContext {
private BodyColor bodyColor;
public void setBodyColor(BodyColor bodyColor) {
this.bodyColor = bodyColor;
}
public void change (Chameleon chameleon){
bodyColor.change(chameleon) ;
}
}
/**
* 变色龙身体颜色抽象类
*/
interface BodyColor {
void change (Chameleon chameleon);
}
/**
* 变色龙身体颜色具体类
*/
class GreenColor implements BodyColor {
@Override
public void change(Chameleon chameleon) {
System.out.println("变化前:"+chameleon.color+";"+chameleon.contextDesc);
chameleon.contextDesc = "树叶环境" ;
chameleon.color = "绿色" ;
System.out.println("变化后:"+chameleon.color+";"+chameleon.contextDesc);
}
}
class GrayColor implements BodyColor {
@Override
public void change(Chameleon chameleon) {
System.out.println("变化前:"+chameleon.color+";"+chameleon.contextDesc);
chameleon.contextDesc = "树枝环境" ;
chameleon.color = "灰色" ;
System.out.println("变化后:"+chameleon.color+";"+chameleon.contextDesc);
}
}

二、状态模式

1、基础概念

状态模式是对象的行为模式,状态模式允许一个对象在其内部状态改变的时候改变其行为。状态模式把对象的行为封装在不同状态的对象中,每一个状态对象都是抽象状态类的子类。意图是让一个对象在其内部状态改变的时候,其行为也随之改变。

2、模式图解

3、核心角色

  • 环境角色

持有具体状态类的对象实例。这个具体状态类的实例给出此环境对象的现有状态。

  • 抽象状态角色

定义一个接口,封装环境对象的状态所对应的行为。

  • 具体状态角色

具体状态类实现了环境的状态所对应的行为。

4、源码实现

public class C02_State {
public static void main(String[] args){
Context context = new Context();
State state = new ConcreteStateA() ;
context.setState(state);
context.printInfo("当前环境状态A");
state = new ConcreteStateB();
context.setState(state);
context.printInfo("当前环境状态B");
}
}
/**
* 环境角色
*/
class Context {
private State state;
public void setState(State state) {
this.state = state;
}
public void printInfo (String info) {
state.stateInfo(info);
}
}
/**
* 抽象状态角色
*/
interface State {
void stateInfo (String param);
}
/**
* 具体状态角色
*/
class ConcreteStateA implements State {
@Override
public void stateInfo (String info) {
System.out.println("ConcreteStateA:" + info);
}
}
class ConcreteStateB implements State {
@Override
public void stateInfo (String info) {
System.out.println("ConcreteStateB:" + info);
}
}

三、模式总结

  1. 将容易产生问题的if-else语句拆分,状态模式将每个状态的行为封装到对应的一个类中,代码有很强的可读性。
  2. 符合“开闭原则”,容易增删操作,管理状态。
  3. 会存在很多状态时。每个状态都要一个对应的类,会产生很多类,增加维

    护难度。
  4. 应用场景:当一个事件或者对象有很多种状态,状态之间会相互转换,不同的状态有不同的行为,可以考虑使用状态模式。

四、源代码地址

GitHub·地址
https://github.com/cicadasmile/model-arithmetic-parent
GitEE·地址
https://gitee.com/cicadasmile/model-arithmetic-parent

Java描述设计模式(21):状态模式的更多相关文章

  1. 折腾Java设计模式之状态模式

    原文地址 折腾Java设计模式之状态模式 状态模式 在状态模式(State Pattern)中,类的行为是基于它的状态改变的.这种类型的设计模式属于行为型模式.在状态模式中,我们创建表示各种状态的对象 ...

  2. python设计模式之状态模式

    python设计模式之状态模式 面向对象编程着力于在对象交互时改变它们的状态.在很多问题中,有限状态机(通常名为状态机)是一个非常方便的状态转换建模(并在必要时以数学方式形式化)工具.首先,什么是状态 ...

  3. 【转】设计模式 ( 十七) 状态模式State(对象行为型)

    设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...

  4. 设计模式 ( 十七) 状态模式State(对象行为型)

    设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...

  5. 乐在其中设计模式(C#) - 状态模式(State Pattern)

    原文:乐在其中设计模式(C#) - 状态模式(State Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 状态模式(State Pattern) 作者:webabcd 介绍 允 ...

  6. 北风设计模式课程---状态模式State(对象行为型)

    北风设计模式课程---状态模式State(对象行为型) 一.总结 一句话总结: 状态模式 具体状态的行为在具体的状态类中就解决,不用交给外部做判断.实质是将多条件判断弄成了多个类,在不同的类中做判断 ...

  7. js设计模式——5.状态模式

    js设计模式——5.状态模式 代码演示 /*js设计模式——状态模式*/ // 状态(红灯,黄灯,绿灯) class State { constructor(color) { this.color = ...

  8. 设计模式2——状态模式State

    参考链接: 设计模式之状态模式:https://www.cnblogs.com/haoerlv/p/7777789.html 设计模式系列之状态模式:https://www.jianshu.com/p ...

  9. JAVA设计模式--State(状态模式)

    状态模式(State Pattern)是设计模式的一种,属于行为模式. 定义(源于Design Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式主要 ...

随机推荐

  1. HDU 6045 Is Derek lying?

    题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=6045 题目: Is Derek lying? Time Limit: 3000/1000 MS (Ja ...

  2. 8.Nginx基本概述

    io网络模型介绍 1.介绍Nginx Nginx是一个高性能的HTTP和反向代理web服务器 2.常见的Web服务器 httpd Nginx Tengine OpenResty 3.介绍Nginx应用 ...

  3. 图论-最小生成树<Kruskal>

    昨天: 图论-最小生成树<Dijkstra,Floyd> 以上是昨天的Blog,有需要者请先阅读完以上再阅读今天的Blog. 可能今天的有点乱,好好理理,认真看完相信你会懂得 然而,文中提 ...

  4. 用Wireshark抓包分析请求

    前言 有些封装好的API把错误都屏蔽掉,直接返回某一个不明确的具体错误,让人感到困惑. //code in SDK read-only public static Data requestHandle ...

  5. 实用Linux控制台命令

    实用Linux控制台命令 screen 例如用Xshell连接 服务器 screen -ls 列出当前用户所有的screen screen 回车直接创建新的screen screen -S scree ...

  6. T​h​e​ ​v​a​l​u​e​ ​f​o​r​ ​t​h​e​ ​u​s​e​B​e​a​n​ ​c​l​a​s​s​ ​a​t​t​r​i​b​u​t​e​ ​i​s​ ​invalied

    JSP: T​h​e​ ​v​a​l​u​e​ ​f​o​r​ ​t​h​e​ ​u​s​e​B​e​a​n​ ​c​l​a​s​s​ ​a​t​t​r​i​b​u​t​e​ ​X​X​X​ ​i​s ...

  7. JVM(3) 垃圾收集器与内存分配策略

    一.垃圾收集的概念 在Java虚拟机运行时数据区中程序计数器.虚拟机栈和本地方法栈3个区域随线程而生,随线程而灭:栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作,每一个栈帧中分配多少内 ...

  8. Java基础(十二)lambda表达式

    1.引入lambda表达式的重要性 lambda表达式是一个可传递的代码块,可以在以后执行一次或多次. 在前面的回调部分,有一个例子是,ActionListener类实现了TimePrinter接口并 ...

  9. Redis(七)Redis的噩梦:阻塞

    为什么说阻塞是Redis的噩梦: Redis是典型的单线程架构,所有的读写操作都是在一条主线程中完成的.当Redis用于高并发场景时,这条线程就变成了它的生命线.如果出现阻塞,哪怕是很短时间,对于应用 ...

  10. 设计模式C++描述----09.桥接(Bridge)模式

    一. 举例 N年前: 计算机最先出来时,软件和硬件是一绑在一起的,比如IBM出了一台电脑,上面有一个定制的系统,假如叫 IBM_Win,这个IBM_Win系统当然不能在HP电脑上运行,同样HP出的HP ...