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

目录

一、背景介绍

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

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

五、升华

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

相关推荐
总是学不会.1 分钟前
【JUC编程】多线程学习大纲
java·后端·开发
MediaTea4 分钟前
思考与练习(第十章 文件与数据格式化)
java·linux·服务器·前端·javascript
7澄19 分钟前
Maven 项目拆分与聚合实战:分层架构下的多模块开发
java·架构·maven·service·dao·pojo·数据库连接
一起养小猫15 分钟前
LeetCode100天Day4-盛最多水的容器与两数之和II
java·数据结构·算法·leetcode
ZBritney20 分钟前
JAVA中的多线程
java
whn197724 分钟前
达梦数据库的整体负载变化查看
java·开发语言·数据库
小满、24 分钟前
RabbitMQ:Fanout、Direct、Topic 交换机、队列声明与消息转换器
java·分布式·消息队列·rabbitmq·spring amqp
檀越剑指大厂33 分钟前
【Idea系列】换行处理
java·ide·intellij-idea
kylezhao20191 小时前
C#23种设计模式-单例模式(Singleton)详解与应用
单例模式·设计模式·c#
wanghowie1 小时前
01.04 Java基础篇|泛型、注解与反射实战
java·开发语言·windows