软考设计模式——状态模式(C++篇)
2017-11-08 11:51
218 查看
状态模式顾名思义就是通过改变状态来控制对象的行为。
设计思路简而言之,就是有一个对象,这个对象需要一些状态,用状态当参数去实例化这个对象,然后根据一些参数的改变,去改变这个对象的状态,然后让这个对象根据状态的不同做不同的行为。
举个简单的例子,把一个人(这个人会实例化成一个对象)分为青年,中年,老年三种状态,在每个年龄阶段可以干不同的事情。
接下来要分别设置状态:
客户使用:
设计思路简而言之,就是有一个对象,这个对象需要一些状态,用状态当参数去实例化这个对象,然后根据一些参数的改变,去改变这个对象的状态,然后让这个对象根据状态的不同做不同的行为。
举个简单的例子,把一个人(这个人会实例化成一个对象)分为青年,中年,老年三种状态,在每个年龄阶段可以干不同的事情。
#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; }
相关文章推荐
- 设计模式与软考试题之状态模式(二)
- 软考总结— 设计模式之状态模式
- 【软考学习】设计模式——状态模式
- 设计模式与软考试题之状态模式(一)
- Java设计模式-状态模式(State)
- java设计模式——状态模式
- iOS设计模式-开发思路提问(系列1:一个Button的三种状态怎样切换?)
- 老僧长谈设计模式-6-状态模式
- 再探设计模式之状态模式(纸牌游戏的开发)
- GoF23种设计模式之行为型模式之状态模式
- 【设计模式】学习笔记14:状态模式(State)
- 设计模式-状态模式
- 设计模式-行为型之状态模式
- 设计模式读书笔记-----状态模式
- 设计模式笔记(22)---状态模式(行为型)
- 设计模式之状态模式
- 设计模式读书笔记-状态模式
- C++设计模式-State状态模式
- 设计模式学习笔记之十:状态模式
- 设计模式——状态设计模式