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