欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java描述设计模式(21):状态模式

程序员文章站 2022-05-29 09:48:58
本文源码: "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、模式图解

Java描述设计模式(21):状态模式

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):状态模式