- 1、本文档共60页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
08.行为模式2剖析
动机(TCPConnection) 利用State模式的关键思想是引入了一个称为TCPState的抽象类来表示网络的连接状态,并为表示不同状态的子类声明公共接口。 TCPState的子类实现与特定状态相关的行为 例如,TCPEstablished和TCPClosed类分别实现了特定于TCPConnection的连接已建立状态和连接已关闭状态的行为。 TCPConnection类维护一个表示TCP连接当前状态的状态对象:一个TCPState子类的实例 TCPConnection类将所有与状态相关的请求委托给状态对象。 一旦连接状态改变, TCPConnection对象就会改变它所使用的状态对象(实现状态转换)。 例如当连接从已建立状态转为已关闭状态时, TCPConnection 会用一个TCPClosed的实例来代替原来的TCPEstablished的实例。 动机(TCPConnection) 和状态相关的行为 委托给状态对象 动机(一个人事系统例子) 假设一个人事系统中的人员包括全民所有制、集体所有制和劳务派遣制,他们的很多行为(如计算工资等)与人员的性质有关。 如何建模? 动机(一个人事系统例子) 人员 全民所有制 人员 集体所有制 人员 劳务派遣制 人员 Person { virtual abstract double GetSalary;} QuanMinPerson: Person { override double GetSalary{ return ** } } …… 不好(但常见)的实现 人员 人员性质 全民所有制 集体所有制 劳务派遣制 Person { double GetSalary{ Return YongGongXZState.GetSalary(); }; } 好的实现 适用性 在下面的两种情况下均可使用State模式: 一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。 一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。 这个状态通常用一个或多个枚举常量表示。 如果有多个操作包含相同的条件结构,State模式可以将每一个条件分支放入一个独立的类中。 这使得可以根据对象自身的情况将对象的状态作为一个对象,这一对象可以不依赖于其他对象而独立变化。 结构 和状态相关的行为 在不同状态下行为是不一样的 参与者 Context(环境,如TCPConnection) 定义客户感兴趣的接口。 维护一个ConcreteState子类的实例,这个实例定义当前状态。 State(状态,如TCPState) 定义一个接口以封装与Context的一个特定状态相关的行为。 ConcreteState(具体状态子类,如TCPEstablished, TCPListen, TCPClosed) 每一子类实现一个与Context的一个状态相关的行为。 协作 Context将与状态相关的请求委托给当前的ConcreteState对象处理。 Context可将自身作为一个参数传递给处理该请求的状态对象。 这使得状态对象在必要时可访问Context 。 Context是客户使用的主要接口 客户可用状态对象来配置一个Context(初始状态)。 一旦一个Context配置完毕, 客户不再需要直接与状态对象打交道(由Context或State自动进行状态转移)。 Context或ConcreteState子类都可决定哪个状态是另外哪一个的后继者,以及是在何种条件下进行状态转换。 效果 1)它将与特定状态相关的行为局部化,并且将不同状态的行为分割开来 常见的利用一个数据值定义内部状态的方法会使整个Context的实现中遍布看起来很相似的条件语句或case语句,并且增加一个新的状态可能需要改变若干个操作,维护复杂。 State模式将所有与一个特定的状态相关的行为都放入一个对象中,通过定义新的State子类可以很容易的增加新的状态和转换。 2)它使得状态转换显式化 当一个对象仅以内部数据值来定义当前状态时, 其状态仅表现为对一些变量的赋值,不够明确。 为不同的状态引入独立的对象使得转换变得更加明确。 并且,State对象可保证Context不会发生内部状态不一致的情况,因为从Context的角度看,状态转换是原子的。 效果 3)State对象可被共享 如果State对象本身没有实例变量(即它们表示的状态完全以它们的类型来编码),那么各Context对象可以共享一个State对象。 当状态以这种方式被共享时, 它们是没有内部状态, 只有行为的轻量级对象。 实现 1)谁定义状态转换 State模式不指定哪一个参与者定义状态转换准则。 如果该准则是固定的,可在Context
您可能关注的文档
最近下载
- 1425调剂学(本)-国家开放大学2021年1月至2022年1月期末考试真题及答案(202101-202201三套).pdf VIP
- 师资队伍建设中长期发展规划.docx VIP
- 通信工程安全技术交底.ppt VIP
- 幼儿园 大班社会《特殊的车辆》.pptx VIP
- JTJ-T212-2010地下工程渗漏治理技术规程.doc VIP
- 2024年宁夏中考生物·地理合卷试题卷(含答案解析).docx
- 2024年江苏省公务员省考《行测》(A类)真题(含答案).pdf VIP
- 初中英语语法-八大时态之一般过去时课件.pptx VIP
- 教学课件:《商法(第四版)》范健.ppt
- 2025学校师资队伍建设三年发展规划.docx VIP
文档评论(0)