软考设计模式——状态模式(C++篇)

来源:互联网 发布:山西省软件行业协会 编辑:程序博客网 时间:2024/06/16 00:13

状态模式顾名思义就是通过改变状态来控制对象的行为。



设计思路简而言之,就是有一个对象,这个对象需要一些状态,用状态当参数去实例化这个对象,然后根据一些参数的改变,去改变这个对象的状态,然后让这个对象根据状态的不同做不同的行为。



举个简单的例子,把一个人(这个人会实例化成一个对象)分为青年,中年,老年三种状态,在每个年龄阶段可以干不同的事情。


#include <iostream>#include <string>using namespace std;class Person; //因为要用到person,所以先声明一下class State{ //设定抽象类:状态类,这个类用来获取当前人的状态public:virtual void young(){}         //用了virtual的话,这个State类不能被实例化,他的子类需要重载才能用这个函数virtual void mid(){}virtual void old(){}virtual void nowState(Person *person){} //nowState就是获取当前的状态,每个函数里要写这个同名函数覆盖父类的这个函数};class Person{private:State *state;         //声明一个状态类的指针,使用指针才能用“->”这个符号来调用这个类的函数int age;         //年龄public:Person(State *state,int age){this->state = state; this->age = age;}         //Person的构造函数,初始化时传入初始的状态指针和年龄void setState(State *state){this->state = state;}         //设定状态,设定状态后,Person的状态就会改变成相应的状态void getState(){state->nowState(this);}         //获得状态,根据设定好的状态去调用该状态的nowState方法void setAge(int age){this->age = age;}         //设定年龄int getAge(){return this->age;}         //获得年龄};


接下来要分别设置状态:


class OldMan:public State{void old(Person *person){if(person->getAge() > 50){cout<<"You're old"<<endl;}}void nowState(Person *person){old(person);}         //Person里面的getState方法里面调用的就是这个函数,这个函数又调用了自己类的old函数};class MidMan:public State{void mid(Person *person){if(person->getAge() > 25 && person->getAge()<=50){cout<<"You're mid"<<endl;}else{person->setState(new OldMan());                         //使用setState方法,然后实例化一个OldMan的指针(new出来的对象,他的类型就是指针)当做参数来更改状态}}void nowState(Person *person){mid(person);}};class Young:public State{void young(Person *person){if(person->getAge() <= 25){cout<<"You're young"<<endl;}else{person->setState(new MidMan());}}void nowState(Person *person){young(person);}};


客户使用:


int main(){int age=1;Person *person = new Person(new Young(),age);         //这里初始化一个Person对象for(age = 1;age < 100;age+=9){cout<<"now_age:"<<age<<endl;person->setAge(age);person->getState();                 //通过person对象来获取状态,因为状态会在age变化时改变,具体来说就是getState调用了状态的currentState,然后进入相应的方法去改变状态}getchar();return 0;}



原创粉丝点击