首页 > 编程知识 正文

java状态模式应用场景

时间:2023-05-05 20:33:56 阅读:190470 作者:567

听说过状态模式的人可能没有那么多。 它不在我们熟悉的23种设计模式中。 但是,那是归属和行动模式之一。 今天一起学习学习状态模式吧!

在“状态模式”(State Pattern )中,类的行为取决于其状态。 这种类型的设计模式是行为模式。 通常,创建表示各种状态的对象和行为随状态对象的变化而变化的context对象。

状态模式的最大优点是,可以在内部状态发生变化时改变对象的行为,使对象看起来像修改了类一样。

主要解决方案可以根据对象的状态(属性)而变化相关联的行为。

使用场景:代码包含许多有关对象状态的条件语句。

如何使用,从订单的状态来看例子吧。

在电子商务系统中,购物过程中,订单通常都有这些状态,等待付款、等待出库、等待评估、等待完成。 的状态不同,用户看到的提示信息也不同。

根据上面的类图,首先实现抽象的状态接口。

span style=' color : # f8f8d4' publicinterfaceorderstate { void action (context context ); void doPrint (; (}/span暂挂付款实现类。

span style=' color : # f8f8d4' publicclasspendingpaymentstateimplementsorderstate { @ overridepublicvoidaction () } @ overe }}/span等待签出状态。

span style=' color : # f8f8d4' publicclasswaitoutstockstateimplementsorderstate { @ overridepublicvoidaction () } @ overrrid }}/span等待接收状态。

span style=' color : # f8f8d4' publicclasspendingdeliveryorderimplementsorderstate { @ overridepublicvoidaction (上下文相关) (}}/span等待评估的状态。

span style=' color : # f8f8d4' publicclasspendingevaluationimplementsorderstate { @ overridepublicvoidaction () } @ overrrid }}/span订单完成状态。

span style=' color : # f8f8d4' publicclasscompletedorderimplementsorderstate { @ ov }

erride public void action(Context context){ context.setOrderState(null); } @Override public void doPrint(){ System.out.println("订单完成状态"); }}</span>

Context 类,订单状态变化引起行为变化。

<span style="color:#f8f8d4">public class Context{ private OrderState orderState; public Context(OrderState orderState){ this.orderState = orderState; } public void setOrderState(OrderState orderState){ this.orderState = orderState; } public void action(){ this.orderState.action(this); } public void printInfo(){ if (this.orderState != null){ this.orderState.doPrint(); } }}</span>

下面使用 XttblogOrderDemo 类,模拟一下生产环境中的使用场景。

<span style="color:#f8f8d4">public class XttblogOrderDemo{ public static void main(String[] args){ OrderState orderState = new PendingPaymentState(); Context context = new Context(orderState); context.printInfo(); //用户付款 context.action(); context.printInfo(); //商家出库发货 context.action(); context.printInfo(); //用户签收 context.action(); context.printInfo(); //用户评价 context.action(); context.printInfo(); }}</span>

总结下来,状态模式中涉及到 3 个角色。

环境(Context)角色,也成上下文:定义客户端所感兴趣的接口,并且保留一个具体状态类的实例。这个具体状态类的实例给出此环境对象的现有状态。抽象状态(State)角色:定义一个接口,用以封装环境(Context)对象的一个特定的状态所对应的行为。具体状态(ConcreteState)角色:每一个具体状态类都实现了环境(Context)的一个状态所对应的行为。

状态模式和策略模式的结构是比较相似的,但是两者却存在较大区别。策略模式是对算法或者策略建模,不涉及算法之间的切换。而状态模式是对状态进行建模,涉及状态之间的切换,其实就是状态机的模型,每种状态对应不同的处理逻辑。

状态模式在实际工作中非常的常用,比如:投票应用。一个在线投票系统的应用,要实现控制同一个用户只能投一票,如果一个用户反复投票,而且投票次数超过5次,则判定为恶意刷票,要取消该用户投票的资格,当然同时也要取消他所投的票;如果一个用户的投票次数超过8次,将进入黑名单,禁止再登录和使用系统。要使用状态模式实现,首先需要把投票过程的各种状态定义出来,根据以上描述大致分为四种状态:正常投票、反复投票、恶意刷票、进入黑名单。

叫号系统,取号,排队等待,办理业务,评价等。在比如游戏中的不同动作等。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。