Java描述设计模式(21):状态模式
程序员文章站
2024-02-01 17:57:04
本文源码: "GitHub·点这里" || "GitEE·点这里" 一、生活场景 1、场景描述 变色龙是爬行动物,是非常奇特的动物,它有适于树栖生活的种种特征和行为,身体也会随着环境的变化而变化出适应环境的颜色,非常神奇。下面基于状态模式对该变化过程进行描述。 2、代码实现 二、状态模式 1、基础概 ......
本文源码: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); } }
三、模式总结
- 将容易产生问题的if-else语句拆分,状态模式将每个状态的行为封装到对应的一个类中,代码有很强的可读性。
- 符合“开闭原则”,容易增删操作,管理状态。
- 会存在很多状态时。每个状态都要一个对应的类,会产生很多类,增加维
护难度。 - 应用场景:当一个事件或者对象有很多种状态,状态之间会相互转换,不同的状态有不同的行为,可以考虑使用状态模式。
四、源代码地址
github·地址 https://github.com/cicadasmile/model-arithmetic-parent gitee·地址 https://gitee.com/cicadasmile/model-arithmetic-parent