设计模式再探——状态模式

目录

一、背景介绍

最近产品中有这样的业务需求,不同时间(这里不是活动的执行时间,而是活动的执行时刻)展示不同的活动;

要求还是需要后续会由N种活动扩充进来,并且扩充的时候还得达到复用之前活动中的一些属性和方法。

结合这样的需求,再探状态模式,豁然开朗,于是乎总结分享。

二、思路&方案

  • 1.状态模式简介
  • 2.状态模式的类图
  • 3.状态模式代码
  • 4.状态模式还可以优化的地方
  • 5.状态模式的项目实战,优化后

三、过程

1.状态模式简介

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

2.状态模式的类图

3.状态模式代码

java 复制代码
package com.a7DesignPattern.a3BehaviorType.a09State;

/**
 * 功能描述:
 *
 * @Author:makang
 * @Date: 2021/5/29 10:39
 */
public abstract class State {
    public abstract void Handle(Context context);
}
java 复制代码
package com.a7DesignPattern.a3BehaviorType.a09State;

/**
 * 功能描述:
 *
 * @Author:makang
 * @Date: 2021/5/29 10:42
 */
public class ConcreteStateA extends State{
    @Override
    public void Handle(Context context) {
        context.setState(new ConcreteStateB());
    }
}
java 复制代码
package com.a7DesignPattern.a3BehaviorType.a09State;

/**
 * 功能描述:
 *
 * @Author:makang
 * @Date: 2021/5/29 10:43
 */
public class ConcreteStateB extends State{

    @Override
    public void Handle(Context context) {
        context.setState(new ConcreteStateA());
    }
}
java 复制代码
package com.a7DesignPattern.a3BehaviorType.a09State;

/**
 * 功能描述:
 *
 * @Author:makang
 * @Date: 2021/5/29 10:39
 */
public class Context {
    private State state;

    Context(State state){
        this.state = state;
    }

    public State getState() {
        return state;
    }

    public void setState(State state) {
        this.state = state;
        System.out.println("当前状态"+state.getClass().getName());
    }

    public void Request(){
        state.Handle(this);
    };
}
java 复制代码
package com.a7DesignPattern.a3BehaviorType.a09State;

/**
 * 功能描述:
 *
 * @Author:makang
 * @Date: 2021/5/29 10:44
 */
public class Client {
    public static void main(String[] args) {
        Context context = new Context(new ConcreteStateA());
        context.Request();
        context.Request();
        context.Request();
        context.Request();
        context.Request();
    }
}

4.状态模式还可以优化的地方

子类的流转是在子类中写死的方式,这样如果后续新增子类对于已有子类的修改是不符合开闭原则的

5.状态模式的项目实战,优化后

java 复制代码
package com.a7DesignPattern.a3BehaviorType.a09State.project;

public class ContentGrain {
    
    String name;

    private ContentGrain nextContentGrain;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public ContentGrain getNextContentGrain() {
        return nextContentGrain;
    }

    public void setNextContentGrain(ContentGrain nextContentGrain) {
        this.nextContentGrain = nextContentGrain;
    }

    public void send(){
        System.out.println("当前对象所属的子类名字为:"+this.getClass().getName());
    }

}
java 复制代码
package com.a7DesignPattern.a3BehaviorType.a09State.project;

public class Topic extends ContentGrain{

    public void dianzan(){
        System.out.println("我还有单独点赞的方法");
    }

    public void send(){
        super.send();
        dianzan();
    }
}
java 复制代码
package com.a7DesignPattern.a3BehaviorType.a09State.project;

public class Practice extends ContentGrain{

    public void isOK(){
        System.out.println("这个活动是有标准答案的");
    }

    public void send(){
        super.send();
        isOK();
    }

}
java 复制代码
package com.a7DesignPattern.a3BehaviorType.a09State.project;

import java.util.List;

public class RunLink {
    private static ContentGrain contentGrain;

    static {
        //这里的链将在配置文件中进行构建
        ContentGrain contentGrain1 = new Topic();
        contentGrain = contentGrain1;
        ContentGrain contentGrain2 = new Practice();
        contentGrain1.setNextContentGrain(contentGrain2);
        ContentGrain contentGrain3 = new Topic();
        contentGrain2.setNextContentGrain(contentGrain3);
    }

    public void run(){
       while (contentGrain.getNextContentGrain() != null){
           contentGrain.send();
           contentGrain = contentGrain.getNextContentGrain();
       }
    }

}
java 复制代码
package com.a7DesignPattern.a3BehaviorType.a09State.project;

public class Client {
    public static void main(String[] args) {

        RunLink runLink = new RunLink();
        runLink.run();

    }
}

四、总结

1.对于运用设计模式原则和具体模式去落地软件工程有了更加明确的边界

2.真正在场景中去理解模式的魅力,会更加清晰明朗

3.结合设计模式的类型,要解决的场景再理解起来更明确了

五、升华

当认知提升之后,不妨再回头看看,设计模式的魅力和伟大会再次让你惊叹

相关推荐
Seven9712 分钟前
剑指offer-22、从上往下打印⼆叉树
java
一乐小哥20 分钟前
从 JDK 到 Spring,单例模式在源码中的实战用法
后端·设计模式
A尘埃29 分钟前
企业级Java项目金融应用领域——保险系统(补充)
java·金融·保险系统
冬天vs不冷34 分钟前
Java基础(九):Object核心类深度剖析
java·开发语言·python
悟空聊架构1 小时前
我的网站被攻击了,被干掉了 120G 流量,还在持续攻击中...
java·前端·架构
Dajiaonew2 小时前
Spring AI RAG 检索增强 应用
java·人工智能·spring·ai·langchain
付春员3 小时前
23种设计模式
设计模式
IT古董5 小时前
第四章:大模型(LLM)】06.langchain原理-(3)LangChain Prompt 用法
java·人工智能·python
轻抚酸~8 小时前
小迪23年-32~40——java简单回顾
java·web安全
Sirius Wu10 小时前
Maven环境如何正确配置
java·maven