来源于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类,调支付方法。
万物是平衡的,有得就有失。为了可扩展性,我们就得多建几个类,将一个复杂方法里的逻辑,进行拆分,分散到各个类里面去做。