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 ,代码的结构也更加清晰易于扩展。这就是设计模式的好处,可以⾮常强⼤的改变原有代码的结构,让以后的扩展和维护都变得容易些。
在实现结构的编码⽅式上可以看到这不再是⾯向过程的编程,⽽是⾯向对象的结构。并且这样的设计模式满⾜了 单⼀职责 和 开闭原则 ,当你只有满⾜这样的结构下才会发现代码的扩展是容易的,也就是增加和修改功能不会影响整体的变化。
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号