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

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

一、背景介绍


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

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


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


二、思路&方案


  • 1.状态模式简介


  • 2.状态模式的类图


  • 3.状态模式代码


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


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


三、过程


1.状态模式简介


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


2.状态模式的类图


981061a0350a467785682b6ad30d602d.png


3.状态模式代码


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


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());
    }
}


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());
    }
}


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);
    };
}


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.状态模式的项目实战,优化后


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());
    }
}


package com.a7DesignPattern.a3BehaviorType.a09State.project;
public class Topic extends ContentGrain{
    public void dianzan(){
        System.out.println("我还有单独点赞的方法");
    }
    public void send(){
        super.send();
        dianzan();
    }
}


package com.a7DesignPattern.a3BehaviorType.a09State.project;
public class Practice extends ContentGrain{
    public void isOK(){
        System.out.println("这个活动是有标准答案的");
    }
    public void send(){
        super.send();
        isOK();
    }
}


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();
       }
    }
}


package com.a7DesignPattern.a3BehaviorType.a09State.project;
public class Client {
    public static void main(String[] args) {
        RunLink runLink = new RunLink();
        runLink.run();
    }
}


四、总结


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

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

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


五、升华


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

相关文章
|
7月前
|
设计模式
设计模式之 State(状态模式)
设计模式之 State(状态模式)
45 0
|
3月前
|
设计模式 Java 测试技术
Java设计模式-状态模式(18)
Java设计模式-状态模式(18)
|
4月前
|
设计模式 网络协议 Java
【十五】设计模式~~~行为型模式~~~状态模式(Java)
文章详细介绍了状态模式(State Pattern),这是一种对象行为型模式,用于处理对象在其内部状态改变时的行为变化。文中通过案例分析,如银行账户状态管理和屏幕放大镜工具,展示了状态模式的应用场景和设计方法。文章阐述了状态模式的动机、定义、结构、优点、缺点以及适用情况,并提供了Java代码实现和测试结果。状态模式通过将对象的状态和行为封装在独立的状态类中,提高了系统的可扩展性和可维护性。
【十五】设计模式~~~行为型模式~~~状态模式(Java)
|
5月前
|
设计模式 JavaScript Go
js设计模式【详解】—— 状态模式
js设计模式【详解】—— 状态模式
90 7
|
6月前
|
设计模式
状态模式-大话设计模式
状态模式-大话设计模式
|
6月前
|
设计模式 存储
行为设计模式之状态模式
行为设计模式之状态模式
|
7月前
|
设计模式 Go
[设计模式 Go实现] 行为型~状态模式
[设计模式 Go实现] 行为型~状态模式
|
7月前
|
设计模式 Java
23种设计模式,状态模式的概念优缺点以及JAVA代码举例
【4月更文挑战第9天】状态模式是一种行为设计模式,允许一个对象在其内部状态改变时改变它的行为,这个对象看起来似乎修改了它的类。
61 4
|
7月前
|
设计模式 JavaScript Java
[设计模式Java实现附plantuml源码~行为型] 对象状态及其转换——状态模式
[设计模式Java实现附plantuml源码~行为型] 对象状态及其转换——状态模式
|
7月前
|
设计模式 Java
【设计模式系列笔记】状态模式
在Java中,状态模式是一种行为设计模式,它允许对象在其内部状态改变时改变其行为。状态模式的关键思想是将对象的状态封装成独立的类,并将对象的行为委托给当前状态的对象。这样,当对象的状态发生变化时,其行为也会相应地发生变化。
80 0