设计模式 笔记 状态模式 State
//---------------------------15/04/28----------------------------
//State 状态模式----对象行为型模式
/*
1:意图:
允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。
2:别名:
状态对象(Objects for States)
3:动机:
4:使用性:
1>一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。
2>一个操作中含有庞大的多分支条件语句,且这些分支依赖于该对象的状态。这个状态通常用一个或
多个枚举常量表示。
5:结构:
Context:
state---------------------------------->State:
Request() Handle()
{state->Handle()} |
----------------------
| |
ConcreteStateA: ConcreteStateB:
Handle() Handle()
6:参与者:
1>Context:
1)定义客户感兴趣的接口。
2)维护一个ConcreteState子类的实例,这个实例定义当前状态。
2>State:
定义一个接口以封装与Context的一个特定状态相关的行为。
3>ConcreteState:
每一个子类实现一个与Context的一个状态相关的行为。
7:协作:
1>Context将与状态相关的请求委托给当前的ConcreteState对象处理。
2>Context可将自身作为一个参数传递给处理该请求的状态对象。这使得状态对象在必要时可访问Context
3>Context是客户使用的主要接口。客户可用状态对象来配置一个Context,一旦一个Context配置完毕,
它的客户不再需要直接与状态对象打交道。
4>Context或ConcreteState子类都可决定哪个状态是另外哪一个的后继者,以及是在何种条件下进行状态转换。
8:效果:
1>它将与特定状态相关的行为局部话,并且将不用状态的行为分割开来:
把一些需要使用大量case的语句分割到不同的状态子类中去,能使结构看起来更加清晰,同时能很容易增加
和转换一个状态。
2>使得状态转换显式化:
在Context看来,状态转换是原子的--只需要重新绑定一个State变量。这样可以保证内部状态一致。
3>State对象可被共享:
如果State对象没有实例变量,就可被很容易共享,因为这样他们只有外部状态,而没有内部状态。
9:实现:
1>谁定义状态转换:
1)Context来进行转换:这需要转换是遵循固定准则的。
2)State自身指定后继者状态,以及何时转换:这样更佳灵活,但是State子类就必须拥有其他子类的信息
这样就产生了依赖,也就是耦合变大。
2>创建和销毁State对象:
1)仅当需要State对象时才创建它们并随后销毁它们
2)提前创建它们并且始终不销毁它们。
也就是空间和时间的对抗,第一种方法注重空间的利用,第二种方法看重时间的重要性。
10:代码示例: */
//说明这两个是类
class TCPOctetStream;
class TCPState;
//Context:定义了接口
class TCPConnection
{
public:
TCPConnection();
void ActiveOpen();
void PassiveOpen();
void Close();
void Send();
void Acknowledge();
void Synchronize();
void ProcessOctet(TCPOctetStream*);
private:
//设置为友元类才能使用ChanggeState接口。
friend class TCPState;
void ChangeState(TCPState*);
private:
TCPState* _state;
};
//abstract State:定义接口,以及实现默认操作
class TCPState
{
virtual void Transmit(TCPConnection*, TCPOctetStream*);
virtual void ActiveOpen(TCPConnection*);
virtual void PassiveOpen(TCPConnection*);
virtual void Close(TCPConnection*);
virtual void Send(TCPConnection*);
virtual void Acknowledge(TCPConnection*);
virtual void Synchronize(TCPConnection*);
protected:
void ChangeState(TCPConnection*, TCPState*);
};
//初始化为关闭状态
TCPConnection::TCPConnection()
{
_state = TCPClosed::Instance();
}
//设置状态
void TCPConnection::ChangeState(TCPState*)
{
_state = s;
}
//所有调用都转到状态对象去调用的
void TCPConnection::ActiveOpen()
{
_state->ActiveOpen(this);
}
void TCPConnection::PassiveOpen()
{
_state->PassiveOpen(this);
}
void TCPConnection::Close()
{
_state->Close(this);
}
void TCPConnection::Send()
{
_state->Send(this);
}
void TCPConnection::Acknowledge()
{
_state->Acknowledge(this);
}
void TCPConnection::Synchronize()
{
_state->Synchronize(this);
}
//定义默认实现
void TCPState::Transmit(TCPConnection*, TCPOctetStream*) {}
void TCPState::ActiveOpen(TCPConnection*){}
void TCPState::PassiveOpen(TCPConnection*){}
void TCPState::Close(TCPConnection*){}
void TCPState::Send(TCPConnection*){}
void TCPState::Acknowledge(TCPConnection*){}
void TCPState::Synchronize(TCPConnection*){}
void TCPState::ChangeState(TCPConnection*, TCPState* s)
{
t->ChangeState(s);
}
//ConcreteState:这三个都适用单例模式实现
class TCPEstablished :
public TCPState
{
public:
static TCPState* Instance();
virtual void Transmit(TCPConnection*, TCPOctetStream*);
virtual void Close(TCPConnection*);
};
//ConcreteState:
class TCPListen :
public TCPState
{
public:
static TCPState* Instance();
virtual void Send(TCPConnection*);
//...
};
//ConcreteState:
class TCPClosed :
public TCPState
{
static TCPState* Instance();
virtual void ActiveOpen(TCPConnection*);
virtual void PassiveOpen(TCPConnection*);
};
//通过接受到的参数,实现一些具体操作,并且使用这个参数来转换状态
void TCPClosed::ActiveOpen(TCPConnection* t)
{
//send SYN, reveive SYN,ACK,etc.这就是具体要做的事。
ChangeState(t,TCPEstablished::Instance());
}
void TCPClosed::PassiveOpen(TCPConnection* t)
{
ChangeState(t, TCPListen::Instance());
}
void TCPEstablished::Close(TCPConnection* t)
{
//send FIN,reveive ACK of FIN
ChangeState(t, TCPListen::Instance());
}
void TCPEstablished::Transmit(TCPConnection* t, TCPOctetStream* o)
{
t->ProcessOctet(o);
}
void TCPListen::Send(TCPConnection* t)
{
//send SYN, receive SYN, ACK etc
ChangeState(t, TCPEstablished::Instance());
}
设计模式 笔记 状态模式 State的更多相关文章
- 【转】设计模式 ( 十七) 状态模式State(对象行为型)
设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...
- 设计模式 ( 十七) 状态模式State(对象行为型)
设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...
- 乐在其中设计模式(C#) - 状态模式(State Pattern)
原文:乐在其中设计模式(C#) - 状态模式(State Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 状态模式(State Pattern) 作者:webabcd 介绍 允 ...
- 北风设计模式课程---状态模式State(对象行为型)
北风设计模式课程---状态模式State(对象行为型) 一.总结 一句话总结: 状态模式 具体状态的行为在具体的状态类中就解决,不用交给外部做判断.实质是将多条件判断弄成了多个类,在不同的类中做判断 ...
- 二十四种设计模式:状态模式(State Pattern)
状态模式(State Pattern) 介绍允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它所属的类. 示例有一个Message实体类,对它的操作有Insert()和Get()方法, ...
- 设计模式2——状态模式State
参考链接: 设计模式之状态模式:https://www.cnblogs.com/haoerlv/p/7777789.html 设计模式系列之状态模式:https://www.jianshu.com/p ...
- 设计模式之 -- 状态模式(State)
状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类.当控制一个对象的状态转换条件分支语句(if...else或switch...case)过于复杂时,可以此模式将状态的判断逻辑 ...
- [设计模式] 20 状态模式 State Pattern
在GOF的<设计模式:可复用面向对象软件的基础>一书中对状态模式是这样说的:允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类.状态模式的重点在于状态转换,很多时候,对 ...
- 设计模式之状态模式(State)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
随机推荐
- 如何使用 Azure PowerShell 在 Azure Marketplace 中查找 Windows VM 映像
本主题介绍如何使用 Azure PowerShell 在 Azure Marketplace 中查找 VM 映像. 创建 Windows VM 时使用此信息来指定 Marketplace 映像. 确保 ...
- 如何将同一云服务下的虚拟机从经典部署模型迁移到 Azure Resource Manager
适用场景 用户希望将特定云服务下的所有虚拟机从经典部署模型(以下简称:ASM)迁移到 Azure Resource Manager(以下简称:ARM). Note 如果云服务下使用 VNET 也希望将 ...
- [Synology] [群晖] 关闭被占用的文件
1. Control Panel: Control Panel > Terminal & SNMP Enable SSH service 2. SSH into Synology 3. ...
- c#中的数据类型简介(委托)
什么是委托? 委托是一种类型,它封装了一类方法,这些方法具有相同的方法签名(signature)和返回类型.定义听起来有点拗口,首先可以确定委托是一种数据类型,那么什么是方法签名,其实就是指方法的输入 ...
- 小米正式开源 SQL 智能优化与改写工具 SOAR
近日,小米正式宣布开源 SOAR. 截至今日,该项目已经获得了 350 个「star」以及 44 个「fork」(GitHub项目地址:https://github.com/XiaoMi/soar) ...
- 转:log4net使用详解
说明:本程序演示如何利用log4net记录程序日志信息.log4net是一个功能著名的开源日志记录组件.利用log4net可以方便地将日志信息记录到文件.控制台.Windows事件日志和数据库(包括M ...
- Windows 软件推荐大全【all】
FastStone: 视频下载王: IDE: FinalShell: 免费海外服务器远程桌面加速,ssh加速,双边tcp加速,内网穿透.FinalShell使用---Xshell的良心国产软件 P ...
- MFC 常用功能总结
目录 ◆ 获取启动参数◆ 调整窗体大小◆ 关闭Dialog窗体◆ Dialog启动时指定控件为焦点◆ Dialog中禁止ESC回车关闭窗体◆ 回车后焦点自动跳到下一个控件◆ 窗体中某个控件捕获右键菜单 ...
- 团队作业——Alpha冲刺 4/12
团队作业--Alpha冲刺 冲刺任务安排 杨光海天 今日任务:着手进行编辑界面的布局,插入控件,并进行参数调整. 明日任务:继续完善编辑界面控件,学习控件交互功能. 郭剑南 今日任务:上网查阅学习了关 ...
- 洛谷 P4707 【重返现世】
题目分析 题目就是求第K种原料的出现期望时间. 考虑广义min-max容斥. \(\text{kthmax}(S)=\sum\limits_{T\subseteq S}(-1)^{|T|-k}\bin ...