当前位置: 移动技术网 > IT编程>开发语言>Java > Java描述设计模式(21):状态模式

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

2019年11月23日  | 移动技术网IT编程  | 我要评论

拉阔书吧,僵尸修仙记,室内装饰风格

本文源码: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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网