设计模式之——状态模式(State)

状态模式是一种设计模式,它将复杂的状态判断逻辑转移到不同的状态对象中,使得对象在内在状态改变时能够改变其行为。例如,在一个婴儿对象(Baby)的例子中,根据婴儿的状态(如SleepState或CryState),对象会执行不同的动作。这种方式提高了代码的可扩展性和可读性,避免了大量if-else或switch语句。通过创建不同的状态类并让它们实现相同接口,我们可以轻松地添加更多状态,而不会影响原有代码结构。

定义

状态(State)模式的定义:对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为。

        当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。

简单的说就是:根据状态决定行为

应用&实现

        在我们以前写代码,遇到根据对象状态要做判断时通常使用的是if else或者switch,而有时根据业务需求这个对象的状态并不能确定有哪些或者为了可扩展性,就需要用到状态模式

        举个例子,我们有一个baby对象,它有时会哭有时会睡觉等,并根据他的状态做出不同反应。代码实现:

  1. 写一个抽象对象BabyStates,他有一些抽象状态方法:
public abstract class BabyStates {
    abstract void cry();
    abstract void sleep();
}
  1. 写一个Baby对象,他继承了BabyStates,他也有自己的状态state
public class Baby extends BabyStates{
    BabyStates state;
    @Override
    void cry() {
        state.cry();
    }
    @Override
    void sleep() {
        state.sleep();
    }
}

3.根据Baby的状态分别写出SleepState对象和CryState对象,使他们都继承BabyStates并分别写出他们对应场景状态的动作:

public class SleepState extends BabyStates{
    @Override
    void cry() { }
    @Override
    void sleep() {
        System.out.println("baby sleeping...");
    }
}
public class CryState extends BabyStates{
    @Override
    void cry() {
        System.out.println("baby crying...");
    }
    @Override
    void sleep() { }
}

        这样我们的程序只需要根据场景调用相应的状态对象即可。

小结

        讲完State模式大家会觉得这个模式与 观察者模式(Observer)访问者模式(Visitor) 特别相似,确实是这样,面向对象编程注重对场景的实现,站在面向对象的角度编写程序即使代码结构相似,但场景逻辑完全不同。

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值