所谓状态模式是指:当一个对象的内部状态改变时,它的行为也随之改变,如何解藕状态与行为之间的藕合关系,且避免大量的if….else…语句的出现,从而使得“对象看起来似乎修改了它的类”。
状态模式的实现非常的简单,就是将状态抽象出来,然后在状态中处理这些请求,这也是面向对象抽象特征的基本应用。
状态模式的UML图如下:
相关角色:
1、状态属主角色Context: 就是状态所描述的事物,如一只狗的状态为睡,站,走,跑,叫....,那么我们所定义的一个类"Dog"就是这里的Context。此角色要定义一些外部关注的接口或服务功能等,同时还要维护一个具体状态角色的实例对象。
2、抽象状态角色State:它是抽象类或接口,是具体状态角色的基类,它定义了具体状态角色所共有的行为并进行封装,由具体状态角色予以不同的实现。
3、具体状态角色 Concrete State:继承自抽象状态角色,并具体实现抽象状态角色定义的接口功能,同时还提供了不同具体状态角色间的切换判断以根据状态属主角色对象的某些条件来决定何时以及如何进行状态的切换。
下面我们用代码来示例State状态模式。
程序如下图:
一、状态模式基本思路示例
1、状态属主角色Context:
}
}
2、抽象状态角色State:
}
3、具体状态角色Concrete State:
}
4、客户应用:
二、俱乐部会员服务的状态模式实现
定义一个俱乐部,它的顾客有三个状态:一般访客,普通会员,贵宾会员。每个顾客都有一个帐户,帐户上存放顾客的存款,根据存款的不同数量切换会员的级别, 当顾客提请俱乐部的服务时,俱乐部将根据顾客的当前级别提供与其级别对应的服务内容。当然,顾客可以存入或消费,并及时修改他们的帐户。
1、状态属主角色Context:ClubAccount
}
}
2、抽象状态角色State:ClubState
}
3、具体状态角色Concrete State:ClubRealStates
}
4、客户应用:
运行效果如下: