java 的状态模式_23种设计模式系列之状态模式

本文介绍了Java状态模式的概念、类图和代码实现。通过购买衣服的不同数量对应不同折扣的例子,阐述了如何利用状态模式改变对象行为。文章通过创建抽象状态类和具体状态类(如九折、五折、黑名单状态),以及环境类来模拟状态变化,并展示了状态模式的优缺点。最后,对比了状态模式与策略模式的区别。
摘要由CSDN通过智能技术生成

在网上买东西都见过一件9折,两件5折,限购两件等等这样的宣传语,我们买不同数量的衣服,就会有不同的折扣,这就是今天所讲的状态模式。

一、认识状态模式

1、概念

状态模式允许一个对象在其内部状态改变的时候改变其行为。这个对象看上去就像是改变了它的类一样。

也就是说,我们把不同的状态包装成一个抽象类,每一个状态都成为一个独立的类。当状态不同时,处理的状态类也就不同了。如果难以理解我们拿上面商场打折扣的那个例子来说明。我们买衣服的时候,商家会把客户买多少衣服封装成一个抽象类,客户买一件衣服,那就使用买一件打九折的机制去处理,客户买两件,那就使用买两件打5折的机制去处理。但是限购两件,当用户买三件的话直接拉入黑名单。

还不理解的话,再来个类图看看。

2、类图

ddc4743cb448b0e03a094cb594aea4b3.png

从上图可以看出,状态模式所涉及到的角色有3个:

(1)环境(Context)角色,也成上下文:定义操作的方法。

(2)抽象状态(State)角色:这里表示折扣接口,用户封装行为。

(3)具体状态(ConcreteState)角色:这里指具体的折扣类。

看起来和策略模式一样,但是最后分析一下就清楚了。下面我们使用代码来演示一下状态模式到底是什么样的。

二、代码实现

第一步:定义抽象状态类

8323bf5e898f5eee662a9f9b8bc6a481.png

第二步:定义具体折扣类

首先是买一件打九折:

53cf261612e8692d5592bacdaca4982a.png

然后是买两件打5折

a4ab36c6ae150b57da9486516343f202.png

最后是买三件被拉入黑名单了

c1e5e217f3a13fb3f320c3ea4e19b032.png

第三部:具体环境类

0b0f34c45fdac81fb33de8faa50c4e8e.png

第四步:我们就演示一下整个状态模式

b9d6610b5bb8549e0f3403486b0c50c6.png

从上面的输出结果可以看到,我们执行不同的命令,会有不同的状态。上面的衣服买一件打九折,买两件打五折,因为限购两件,所以再买一件的时候就直接被拉入黑名单了。

下面我们来分析一下这个状态模式

三、分析状态模式

状态模式的优点相信你也体会到了,可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数。

但是缺点也很明显,那就是当我们的状态比较多的时候,类也比较多,会使得代码显得非常的臃肿。而且context内部实现也比较复杂,没有完全地遵循设计原则。

这里主要看一下和状态模式的区别,这个状态模式乍一看还真的跟策略模式长得差不多,为了使得理解起来方便,举个例子吧。

策略模式就好比你单身的时候,女朋友随时换。你要在这些女朋友之间处理好关系,游刃有余。但是状态模式就不一样了,这就好比你结了婚,娶了老婆。每天就只在自己老婆身边转,去处理即可。再通俗一点,就是策略模式服务的对象是不固定的,但是状态模式服务的对象是固定的,每次都是那一个。

公众号:java的架构师技术栈。获取各种教程资源和持续发布的技术文章。感谢关注

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值