今天介绍的State Pattern与昨天的Strategy Pattern非常的相似,不过它们之间到底有没有甚麽差别呢?现在就带你一起来了解!
通常程序如果碰到「因状态不同而需要有不同的逻辑行为或是处理步骤」,第一个直觉就会想到if-else 或是 switch-case,不过开始添加物件新的状态与其行为时,很可能此类别的方法就会有可怕的条件式,像这样的程序很难去维护,因为对於逻辑转换的修改都可能需要更改每一个方法中的状态条件,随着程序的发展,问题往往只会越来越大,所有状态的条件式也可能变得臃肿不堪。
碰到这种问题,透过状态模式,我们会将物件所有的状态拉出来创一个新的类别,并包含该状态所有的行为,而物件本身只需要有状态的属性来储存其状态,好让它可以呼叫该状态的行为模式。
再举个例子来说,就像手机可以简单分成一般模式、震动模式及勿扰模式(不同的状态类别),在一般模式下,有通知会正常响铃并显示资讯在萤幕上;震动模式的话不会响铃但是会让手机震动;勿扰模式就不会有任何动作了。以上示例了一件事情在三个状态下做了不一样的行为,相信大家对於状态模式又更加熟悉了!
class Context {
private State state;
public Context(State initialState) {
// initial state
this.state = initialState;
state.setContext(this);
}
public void setState(State state) {
this.state = state;
}
public Type request() {
state.handle();
}
}
interface State {
public Type handle();
}
class ConcreteState1 implements State {
private Context context;
public void setContext(Context context) {
this.context = context;
}
public Type handle() {
// A state may issue state transition in context
context.setState(new ConcreteState2);
// other operation
}
}
class ConcreteState2 implements State {
private Context context;
public void setContext(Context context) {
this.context = context;
}
public Type handle() {
// other operation
}
}
看到这边,是不是觉得与上一篇的Strategy Pattern整体的结构非常相似,但它们有个关键的区分方式,就是在状态模式中,特定的状态可能会与其他状态有所关联,来达到物件的状态转换;反之,策略之间几乎不了解彼此,并且独立的存在。
除此之外,也欢迎大家走走逛逛关於我们团队夥伴的文章
juck30808 - Python - 数位行销分析与 Youtube API 教学
SiQing47 - 前端?後端?你早晚都要全端的,何不从现在开始?
day-13 介绍 , 当资料改变时 , 我们可以利用 _render 来更新 dom 可是如果每次...
尝试使用了TIDB後,接着就开始让他跟k8s做结合吧,我会介绍一次完整的TIoperator,然後配...
我们仰望着同一片天空,却看着不同的地方,即使同一片花瓣,我们也会因为不同季节,而有不同的感受,也许对...
前言 做到现在会发现每个ViewController内的程序码都一大堆,有画面元件,有逻辑,有Mod...
现在终於可以开始讲 Grid 单元的事情了,虽然可以讲的事情可能不多,绝大部分会围绕在造成容器影响的...