软考设计模式——状态模式(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;}
阅读全文
0 0
- 软考设计模式——装饰模式(C++)
- 软考设计模式——状态模式(C++篇)
- 软考总结— 设计模式之状态模式
- 设计模式——状态模式(c++)
- 设计模式——状态模式(C++)
- 【软考】——重温设计模式☞命令模式
- 【软考学习】设计模式——单例模式
- 【软考学习】设计模式——建造者模式
- 【软考学习】设计模式——原型模式
- 【软考学习】设计模式——适配器模式
- 【软考学习】设计模式——组合模式
- 【软考学习】设计模式——装饰模式
- 【软考学习】设计模式——代理模式
- 软考--设计模式
- 设计模式—状态模式(十二)
- 设计模式—状态模式
- 设计模式—状态模式
- 设计模式之状态模式(c++)
- mysql条件判断、临时变量
- 从JDK源码看InputStream
- LEGB作用域
- sql语句,如何找出重复的数据
- Tomcat-server.xml文件详解
- 软考设计模式——状态模式(C++篇)
- mtk手机从刷机到修改客户需求的点点滴滴
- Android N JACK编译器不支持多用户同时编译的解决办法
- Vlc编译autoreconf: autopoint is needed because this package uses Gettext
- 禁止手机浏览器下拉刷新
- java集合框架的练习之HashMap集合的运用
- 顶部导航栏之一(选项卡TabBar动态显示几个 滑动,点击)
- oracle中bitand()函数的使用
- 【c基础】c语言 变量 数组元素 数组名做函数参数传递