首页 > 代码库 > 【设计模式】状态模式 改进后的
【设计模式】状态模式 改进后的
1、简单谈谈
状态模式
当一个对象的内在状态改变时允许改变其行为,这个对象看起来是改变了其类。
状态模式要解决的问题是:当控制一个对象状态转换的条件表达式过于复杂时的情况,
把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。
优点:简化了一个对象的状态转换和行为改变的代码,把这部分代码放在了【状态类】
中,需要注意的一点是:在【状态类】中,每个不同的【状态值】也许会被“串起来”
成为一条链,这样就能保证设置不同的“离散的”【状态值】时,可以在“链上”有
有个对应的处理(行为)。
缺点:在【状态类】在要引用【客户类】,而在【客户类】中也要用到【状态类】,
两个类要互相引用。 耦合度稍高。
2、代码为例
//状态抽象基类class CState{public: CState(); virtual ~CState(); virtual void Show(CMe* pMe) = 0; };CState::CState(){}CState::~CState(){}//单身状态类class CSingle : public CState{public: CSingle(); virtual ~CSingle(); virtual void Show(CMe* pMe);};CSingle::CSingle(){}CSingle::~CSingle(){}void CSingle::Show(CMe* pMe){ if(NULL == pMe) return; int nAge = pMe->GetAge(); //if .. else 把状态串成了一条链,得以让每个状态都有一个对应的处理。 if(nAge < 18) { cout << endl << "哥哥今年才 " << nAge << " 岁啊,还不能找女朋友啊啊 单身啊!! " <<endl; } else { pMe->SetState(new CWithGirl()); pMe->ShowMsg(); }}//有女朋友状态类class CWithGirl : public CState{public: CWithGirl(); virtual ~CWithGirl(); virtual void Show(CMe* pMe) ;};CWithGirl::CWithGirl(){}CWithGirl::~CWithGirl(){}void CWithGirl::Show(CMe* pMe){ if(NULL == pMe) return; int nAge = pMe->GetAge(); if(nAge >= 18) { cout << endl << "哥哥今年已经 " << nAge << " 岁了啊 哈哈 ,可以有女朋友了啊啊 哈哈哈!!" << endl; } }//我 类class CMe{public: CMe(); virtual ~CMe(); void SetState(CState* pState); //设置状态 void ShowMsg(); //显示此状态的信息, 供 int GetAge() const; //获取年龄 void SetAge(int nAge); //设置年龄protected: CState* m_ptrState; //状态 int m_nAge; //年龄};CMe::CMe() : m_ptrState(NULL), m_nAge(0){}CMe::~CMe(){}void CMe::SetState(CState* pState) //状态的改变放在State类中{ m_ptrState = pState;}void CMe::ShowMsg() //不同状态对应的不同行为 表现在 State类中的Show函数{ m_ptrState->Show(this);}int CMe::GetAge() const {return m_nAge;}void CMe::SetAge(int nAge) {this->m_nAge = nAge;}
客户端
int _tmain(int argc, _TCHAR* argv[]){ //对客户来说,只需要设置CMe类的不同年龄,而每个年龄(状态)对应 //的行为并不在CMe类中实现,而是在State类中实现 CMe me1; me1.SetAge(16); me1.ShowMsg(); cout << endl << endl; me1.SetAge(20); //16变为20,相当于状态的改变 me1.ShowMsg(); //同样的一个ShowMsg方法,在不同状态的时候其行为也不一样 cout << endl << endl; return 0;}
3、补充说明
有一个待解决的问题,就是两个类的相互引用,关键是先出现的类中引用了后出现类中的函数,这是问题,所以,这篇,没有执行结果截图
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。