一、背景介绍
最近产品中有这样的业务需求,不同时间(这里不是活动的执行时间,而是活动的执行时刻)展示不同的活动;
要求还是需要后续会由N种活动扩充进来,并且扩充的时候还得达到复用之前活动中的一些属性和方法。
结合这样的需求,再探状态模式,豁然开朗,于是乎总结分享。
二、思路&方案
- 1.状态模式简介
- 2.状态模式的类图
- 3.状态模式代码
- 4.状态模式还可以优化的地方
- 5.状态模式的项目实战,优化后
三、过程
1.状态模式简介
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
2.状态模式的类图
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.结合设计模式的类型,要解决的场景再理解起来更明确了
五、升华
当认知提升之后,不妨再回头看看,设计模式的魅力和伟大会再次让你惊叹