状态模式讲解


来源于B站极客架构师老吴大佬

属于行为型模式

定义

Allow an object to alter its behavior when its internal state changes.The object will appear to change its class.
—— Gof《Design Patterns: Elements of Reusable Object-Oriented Software》
允许一个对象,在其内部状态改变时,改变它的行为。对象看起来似乎修改了它的类。

状态

谁的状态?

对象的状态

状态怎么了?

状态发生了变化,被谁改变的,如何改变的,定义里面都没有,说明这些都不重要,重要的是它改变了。

状态改变的后果

状态改变的后果,就是对象的行为发生了变化,在面向对象的编程思想体系中,行为通常就是类中定义的方法,或者说对象的方法。以前的面向过程语言里面,被称为函数。

一般情况下,类中的方法,**在定义类的时候功能已经明确了,固定了,**但是这里它的行为却发生了变化,造成的后果就是,给人一种错觉,对象对应的类发生了变化,既然是错觉,就意味着类并没有发生变化。

那么类的方法,如何才能发生变化,是状态模式要解决的重要问题。

总结

当对象的内部状态发生变化时,对象方法的行为,也会随之改变,给人造成一种对象对应的类发生了改变的错觉。

我的理解

今年软考的时候看设计模式例题的时候遇到了状态模式。

航空公司有不同的等级,不同的里程数决定了不同的等级。之后做题,做完题还是不太了解这个状态模式有什用。一直很好奇状态是怎么改变行为的?做完题,也没仔细去分析。

最近看完了大佬的状态模式,豁然开朗呀,我的理解跟策略模式差不多。

举个列子吧。

qq会员有不同的等级。普通用户,vip,超级vip。买q币的优惠是不同的,会员是97这,超级会员是94折。现在都是97折,先不讨论它。我们按照以前算。

不同的会员等级算是不同的状态吧。所以我们买q同样数量的q币,花的钱是不一样的。这就是状态改变行为。

按照我们以前的做法,就是获取用户的会员等级,之后在支付这个方法根据等级进行计算,乘以不同的优惠额度。

用了设计模式我们就可以,有几个不同状态的类,我们就可以建立几个不同的service类。service类继承抽象类,在这个抽象类建一个map来维护,key是状态,val是service类。

之后在调用支付的时候,我们就根据状态获取不同的service类,调支付方法。

万物是平衡的,有得就有失。为了可扩展性,我们就得多建几个类,将一个复杂方法里的逻辑,进行拆分,分散到各个类里面去做。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值