大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
动机
在软件构建过程中,某些对象的状态如果改变,其行为也会随之而发生变化,比如文档处于只读状态,其支持的行为和读写状态支持的行为就可能不同.
如何在运行时根据对象的状态来透明地更改对象的行为?而不会为对象操作和状态转换之间引入紧耦合
模式定义
允许一个对象在其内部状态改变时改变它的行为.从而使对象看起来似乎修改了其行为.从而使对象看起来似乎修改了其行为.从而使对象看起来似乎修改了其行为.
实例
朴素
根据状态来执行下一步
enum NetworkState{
Network_Open,
Network_Close,
Network_Connect
}
class NetworkProcessor{
NetworkState state;
public:
void Opration1(){
if(state == Network_Open){
//******
state = Network_Close;
}
else if(state == Network_Close){
//.....
state = Network_Connect;
}
else if(state == Network_Connect){
//$$$$$
state = Network_Open;
}
}
void Opration2(){
if(state == Network_Open){
//******
state = Network_Connect;
}
else if(state == Network_Close){
//.....
state = Network_Open;
}
else if(state == Network_Connect){
//$$$$$
state = Network_Close;
}
}
void process3(){
//...}
}
状态模式State
enum NetworkState{
public:
NetworkState *pNext;
virtual void Operation1() = 0;
virtual void Operation2() = 0;
virtual void Operatino3() = 0;
virtual ~NetworkState(){
}
}
class OpenState : public NetworkState{
static NetworkState* m_instance;
public:
static NetworkState* getInstance(){
if(m_instance == nullptr){
return m_instance;
}
}
void Operation1(){
//*******
pNext = CloseState::getInstance();
}
void Operation2(){
//........
pNext = ConnectState::getInstance();
}
void Operation3(){
//$$$$$$$$
pNext = NextworkOpen::getInstance();
}
}
class CloseState : public NetworkState{
//...}
//扩展状态
class WaitState : public NetworkState{
//...}
class NetworkProcessor{
NetworkState* pState;
public:
NetworkProcessor(NetworkState *pstate){
this->pState;
}
void Opration1(){
//....
pState->Operation1();
pState = pState->pNext();
//...
}
void Opration2(){
//....
pState->Operation2();
pState = pState->pNext();
//..
}
void process3(){
//....
pState->Operation3();
pState = pState->pNext();
//..
}
}
结构
要点总结
- State模式将所有与一个特定状态相关的行为都放入一个State的子类对象中,在对象状态切换时,切换相应的对象;但同时维持State的接口,这样实现了具体操作与状态转换之间的解耦
笔记
- 跟Strategy模式很像
- if else 再添加else变更的时候违背了开闭原则
- State设计模式当状态中只有一个行为的时候跟strategy基本一样
- 很多模式其实很像 甚至可以把状态模式和Strategy模式看成一个模式
- 具体什么模式没那么重要 主要是思想
- 把所有和状态有关的操作都转换为装填对象的行为
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/169034.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...