JAVA【设计模式】状态模式

一、定义

在这里插入图片描述

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

二、示例:

模拟场景:
1、人在不同的心情下,会做不同的事情。例如:开心的时候,会做开心的事情。难过的时候,会做难过的事情等。。。
在这里插入图片描述

传统编码方式

if判断不同的状态,执行不同的事情,一当状态变多,方法会变的冗长

package com.qf.design.behavior.state.self.tradition;

import com.qf.design.behavior.state.self.MoodEnum;

public class MoodController {


    public void doSomething(Enum<MoodEnum> enumEnum) {

        //好玩的事情
        if (enumEnum.equals(MoodEnum.FUNNY))
        System.out.println("做好玩的事情");

        //做开心的事情
        if (enumEnum.equals(MoodEnum.HAPPY))
            System.out.println("做开心的事情");

        //做开心的事情
        if (enumEnum.equals(MoodEnum.SAD))
            System.out.println("做悲伤的事情");
    }
}

package com.qf.design.behavior.state.self.tradition;

import com.qf.design.behavior.state.self.MoodEnum;

public class ApiTest {
    public static void main(String[] args) {
        MoodController moodController=new MoodController();
        moodController.doSomething(MoodEnum.SAD);
        moodController.doSomething(MoodEnum.HAPPY);
    }
}

状态模式设计

状态

package com.qf.design.behavior.state.self;

public enum MoodEnum {
    HAPPY,SAD,FUNNY;
}

心情抽象类

package com.qf.design.behavior.state.self;

public abstract class Mood {
    public abstract void doSomething();
}

好玩心

package com.qf.design.behavior.state.self;

public class FunnyMood extends Mood{
    @Override
    public void doSomething() {
        System.out.println("做好玩的事情");
    }
}

开心

package com.qf.design.behavior.state.self;

public class HappyMood extends Mood{
    @Override
    public void doSomething() {
        System.out.println("做开心的事情");
    }
}

悲伤心

package com.qf.design.behavior.state.self;

public class SadMood extends Mood{
    @Override
    public void doSomething() {
        System.out.println("做悲伤的事情");
    }
}

统一管理:MoodHandler

package com.qf.design.behavior.state.self;

import java.util.HashMap;
import java.util.Map;

public class MoodHandler {
    private Map<Enum<MoodEnum>,Mood> moodMap=new HashMap<>();

    public MoodHandler(){
        moodMap.put(MoodEnum.HAPPY,new HappyMood());
        moodMap.put(MoodEnum.SAD,new SadMood());
        moodMap.put(MoodEnum.FUNNY,new FunnyMood());
    }

    public void doThing(Enum<MoodEnum> enumEnum){
         Mood mood = moodMap.get(enumEnum);
         mood.doSomething();
    }
}

测试:ApiTest

package com.qf.design.behavior.state.self;

public class ApiTest {
    public static void main(String[] args) {
        MoodHandler moodHandler=new MoodHandler();
        moodHandler.doThing(MoodEnum.HAPPY);
        moodHandler.doThing(MoodEnum.SAD);
    }
}

UML关系图

在这里插入图片描述
总结:
从以上的两种⽅式对⼀个需求的实现中可以看到,在第⼆种使⽤设计模式处理后已经没有了ifelse ,代码的结构也更加清晰易于扩展。这就是设计模式的好处,可以⾮常强⼤的改变原有代码的结构,让以后的扩展和维护都变得容易些。

在实现结构的编码⽅式上可以看到这不再是⾯向过程的编程,⽽是⾯向对象的结构。并且这样的设计模式满⾜了 单⼀职责 和 开闭原则 ,当你只有满⾜这样的结构下才会发现代码的扩展是容易的,也就是增加和修改功能不会影响整体的变化。

posted @ 2022-08-30 22:40  雾托邦  阅读(368)  评论(0编辑  收藏  举报