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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/amazingdyd/article/details/78476673

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



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



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


#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;
}



猜你喜欢

转载自blog.csdn.net/amazingdyd/article/details/78476673