设计模式——状态模式


作者:云都小生


引言



在自然界中有一种动物叫变色龙,人们都普遍认为变色龙会根据环境去改变自己皮肤的颜色,其实那是误解。其实变色龙变色是根据自己的心情,当它示威时,体色会呈明亮色;当变色龙欲发动攻击时,体色会变很暗。

在其他领域也有这种“状态”模式,例如水会根据温度变成冰或者气体,冰和水蒸气是水的不同状态。在软件设计中,也存在这种逻辑,某个对象会有不同的状态,同时,处于不同状态时行为也都不一样。

如果我们把不同状态的行为以及状态的维护管理存放都存放在该对象中,就会增加类的职责,增加了维护的成本,不利于状态的维护与扩展。

我们可以采用状态模式来进行架构。


概述



状态模式:用于解决系统中对象的状态转换以及不同状态下行为的封装问题。

在状态模式中,将对象本身,与对象不同状态的行为分开,可以根据对象状态的改变,去执行不同的业务方法。

在状态模式中有以下角色:

环境类:它是拥有多种状态的对象,它原本的状态与不同状态的行为都被独立出去(状态类),内部存放着对状态类的引用;

抽象状态类:这是一个接口,声明了状态类中不同状态对应的方法,子类实现这个接口就会实现这个方法;

具体状态类:它是抽象状态类的子类,每一个子类都属于环境类的一种状态,里面持有对环境类的引用,定义了自身状态应该有的行为。


案例


//抽象状态类
abstract class State {
     public abstract void handle();  
}

//兴奋状态类
public class ExcitedState extends State{

    public void handle()
    {
        System.out.println("变色龙感到兴奋,颜色变得更加鲜艳了!");
    }
}

//低沉状态类
public class LowState extends State{
    public void handle()
    {
        System.out.println("变色龙心情很低落,颜色变得低沉了!");
    }
}

//变色龙类
public class Chameleon {
    private State state; //维持一个对抽象状态对象的引用  
    private String name; //其他属性值,该属性值的变化可能会导致对象状态发生变化  

    //设置状态对象  
    public void setState(State state) {  
        this.state = state;  
    }  

    public void request()
    {  
        state.handle();
    }  
}

//测试类
public class Test {
    public static void main(String[] args) {
        Chameleon chameleon = new Chameleon();
        chameleon.setState(new ExcitedState());
        chameleon.request();

        chameleon.setState(new LowState());
        chameleon.request();
    }
}


总结



在状态模式中,分离了状态行为与具体对象(包含状态切换管理),降低了耦合。

在状态模式中,可以通过动态的设置不同状态,实现不同的行为。

但是,状态模式的使用必然会增加系统中类和对象的个数,导致系统运行开销增大,同时也会增加设计难度。

2018/3/22 0:35:31 @Author:云都小生

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值