//---------------------------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的更多相关文章

  1. 【转】设计模式 ( 十七) 状态模式State(对象行为型)

    设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...

  2. 设计模式 ( 十七) 状态模式State(对象行为型)

    设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...

  3. 乐在其中设计模式(C#) - 状态模式(State Pattern)

    原文:乐在其中设计模式(C#) - 状态模式(State Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 状态模式(State Pattern) 作者:webabcd 介绍 允 ...

  4. 北风设计模式课程---状态模式State(对象行为型)

    北风设计模式课程---状态模式State(对象行为型) 一.总结 一句话总结: 状态模式 具体状态的行为在具体的状态类中就解决,不用交给外部做判断.实质是将多条件判断弄成了多个类,在不同的类中做判断 ...

  5. 二十四种设计模式:状态模式(State Pattern)

    状态模式(State Pattern) 介绍允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它所属的类. 示例有一个Message实体类,对它的操作有Insert()和Get()方法, ...

  6. 设计模式2——状态模式State

    参考链接: 设计模式之状态模式:https://www.cnblogs.com/haoerlv/p/7777789.html 设计模式系列之状态模式:https://www.jianshu.com/p ...

  7. 设计模式之 -- 状态模式(State)

     状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类.当控制一个对象的状态转换条件分支语句(if...else或switch...case)过于复杂时,可以此模式将状态的判断逻辑 ...

  8. [设计模式] 20 状态模式 State Pattern

    在GOF的<设计模式:可复用面向对象软件的基础>一书中对状态模式是这样说的:允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类.状态模式的重点在于状态转换,很多时候,对 ...

  9. 设计模式之状态模式(State)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

随机推荐

  1. HttpWebRequest抓取网页内容与直接输入URL得到的内容不一致!球大神帮忙!!

    一.前言 我在做一个百度收录情况查询的软件,就是通过软件来批量查询文章链接是否被百度收录,主要是用来查询某个网址的收录次数还有网站的排行数,思路是借鉴别人的. 二.问题描述 首先需要考虑的是能够支持哪 ...

  2. 解决:Tomcat 局域网IP地址 访问不了

    解决:Tomcat 局域网IP地址 访问不了 2014年10月17日 ⁄ 综合 ⁄ 共 1000字 ⁄ 字号 小 中 大 ⁄ 评论关闭 如果连最基本的localhost:8080都失败的话. 原因就一 ...

  3. Huawei DHCP 全局配置与接口配置

    网络拓扑图如下所示: 说明: 1.交换机Ge0/0/1口和Ge0/0/2口配置基于全局的DHCP: 2.交换机Ge0/0/3口配置基于端口的DHCP: 3.交换机上配置vlan 10 .vlan 20 ...

  4. Windows 7 任务栏图标消失(变透明,仍然占有地方,但是点击无反应)的解决方法

    解决方案:清理资源管理器缓存(重启资源管理器) 1.打开程序管理器(ctrl+shift+esc) 2.在进程那里找到"explorer.exe",然后按结束进程 3.然后在文件( ...

  5. 过滤掉URL中的参数部分

    //将超链接的参数部分滤掉 ?xxx if(url.contains("?")){ url=url.substring(0,url.indexOf("?")); ...

  6. Beta阶段总结博客

    Beta阶段的规划 1.完善并做完阿尔法版本 2.美化界面 3.规格化GIt的使用 4.新增登录注册功能 5.与服务器端有了交互,实现了前后端的对接 6.增加了一些特效 7.每个人分了模块并且最后对于 ...

  7. leetcode 1. Two Sum [java]

    注意点: HashMap<Integer, Integer> return new int[]{}; 3 2 4 target:6 return null; public int[] tw ...

  8. 虚拟主机ip配置,nginx.conf文件配置及日志文件切割

    今天粗略整理了一下虚拟主机配置,nginx.conf文件的配置,及日志文件的切割,记录如下: nginx虚拟主机配置:1.IP地址配置,2.绑定ip地址和虚拟主机详情:1.ip地址的配置:ifconf ...

  9. Spring IOC 之 SmartInitializingSingleton

    使用 实现该接口后,当所有单例 bean 都初始化完成以后, 容器会回调该接口的方法 afterSingletonsInstantiated. 主要应用场合就是在所有单例 bean 创建完成之后,可以 ...

  10. 页面中php传值后循环列表js获取点击的id

    页面中php传值后循环列表js获取点击的id值进行js操作 <script type="text/javascript" src="__PUBLIC__/js/jq ...