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

目录

一、背景介绍

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

要求还是需要后续会由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.结合设计模式的类型,要解决的场景再理解起来更明确了

五、升华

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

相关推荐
千楼4 分钟前
阿里巴巴Java开发手册(1.3.0)
java·代码规范
reiraoy18 分钟前
缓存解决方案
java
安之若素^33 分钟前
启用不安全的HTTP方法
java·开发语言
ruanjiananquan9939 分钟前
c,c++语言的栈内存、堆内存及任意读写内存
java·c语言·c++
chuanauc1 小时前
Kubernets K8s 学习
java·学习·kubernetes
一头生产的驴1 小时前
java整合itext pdf实现自定义PDF文件格式导出
java·spring boot·pdf·itextpdf
YuTaoShao1 小时前
【LeetCode 热题 100】73. 矩阵置零——(解法二)空间复杂度 O(1)
java·算法·leetcode·矩阵
zzywxc7872 小时前
AI 正在深度重构软件开发的底层逻辑和全生命周期,从技术演进、流程重构和未来趋势三个维度进行系统性分析
java·大数据·开发语言·人工智能·spring
YuTaoShao4 小时前
【LeetCode 热题 100】56. 合并区间——排序+遍历
java·算法·leetcode·职场和发展
程序员张34 小时前
SpringBoot计时一次请求耗时
java·spring boot·后端