软件设计模式之路-----状态模式

该博客介绍了状态模式在软件设计中的应用,通过一个生动的女朋友情绪变化的例子,展示了如何将复杂的状态判断逻辑转移到不同的状态对象中,使得代码结构更清晰,易于扩展。状态模式允许对象在内部状态改变时改变其行为,减少了对象间的耦合。虽然会增加类的数量,但能更好地遵循单一职责原则。博客内容包括状态模式的结构与实现,并提供了具体的Java代码示例。
摘要由CSDN通过智能技术生成

 

在生活中,我们经常能有时会感受到,对象的行为跟她的心情有关系。她开心时你跟她开开玩笑,她能跟你打闹,要是她不开心时,你做相同的事,你可能是在玩火。女人嘛难免有几天不开心的。既然生活中存在对象在不同状态下有不同的行为,那么在软件系统中同样会有相同的可能,系统来源于生活。对这种一个对象在接收到同一信号,但是根据状态会做出不同动作的编程。简单的可以使用if--else这样处理,但是这样不灵活。所以我们考虑下状态设计模式。

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

优点:

  • 结构清晰,状态模式将与特定状态相关的行为局部化到一个状态中,并且将不同状态的行为分割开来,满足“单一职责原则”。 
  • 将状态转换显示化,减少对象间的相互依赖。将不同的状态引入独立的对象中会使得状态转换变得更加明确,且减少对象间的相互依赖。 
  • 状态类职责明确,有利于程序的扩展。通过定义新的子类很容易地增加新的状态和转换。

缺点:

  • 状态模式的使用必然会增加系统的类与对象的个数。
  • 状态模式的结构与实现都较为复杂,如果使用不当会导致程序结构和代码的混乱。 
  • 状态模式对开闭原则的支持并不太好,对于可以切换状态的状态模式,增加新的状态类需要修改那些负责状态转换的源码,否则无法切换到新增状态,而且修改某个状态类的行为也需要修改对应类的源码。

状态模式的结构与实现

结构

  1. 环境类(Context)角色:也称为上下文,它定义了客户端需要的接口,内部维护一个当前状态,并负责具体状态的切换。 
  2. 抽象状态(State)角色:定义一个接口,用以封装环境对象中的特定状态所对应的行为,可以有一个或多个行为。 
  3. 具体状态(Concrete State)角色:实现抽象状态所对应的行为,并且在需要的情况下进行状态切换。

实现

实现场景:对象对于我的调戏,根据不同心情做出不同反应

package com.wly.DesignPatterns;

/**
 * @program: StudyDome
 * @author: yuanzhang
 * @create: 2021-01-21 16:28
 **/
public class StatePattern {
    public static void main(String[] args) {
        //new 一个女朋友
        Girlfriend girlfriend = new Girlfriend();
        for (int i = 0; i <3 ; i++) {
            System.out.println("调戏她"+i);
            girlfriend.behavior();
        }
    }

}
abstract class Mood{
    public abstract void behavior(Girlfriend girlfriend);
}
class Happy extends Mood{
    @Override
    public void behavior(Girlfriend girlfriend) {
        System.out.println("开心回应,但是慢慢的又累了");
        girlfriend.setMood(new Depressed());
    }
}
class Depressed extends Mood{
    @Override
    public void behavior(Girlfriend girlfriend) {
        System.out.println("不搭理你,甚至有点烦");
        girlfriend.setMood(new Unhappy());
    }
}
class Unhappy extends Mood{
    @Override
    public void behavior(Girlfriend girlfriend) {
        System.out.println("完了,你完了。等明天恢复心情");
        girlfriend.setMood(new Happy());
    }
}
class Girlfriend{
    private Mood mood;

    /**定义初始情绪*/
    Girlfriend() {
        this.mood = new Happy();
    }

    public Mood getMood() {
        return mood;
    }

    public void setMood(Mood mood) {
        this.mood = mood;
    }
    /**做出反应*/
    public void behavior(){
        mood.behavior(this);
    }
}

输出

调戏她0
开心回应,但是慢慢的又累了
调戏她1
不搭理你,甚至有点烦
调戏她2
完了,你完了。等明天恢复心情

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值