`
flustar
  • 浏览: 96591 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

设计模式学习笔记(十五)—State模式

阅读更多

一、 State模式定义:
允许一个对象在其状态改变时,改变它的行为。看起来对象似乎修改了它的类。
二、 模式解说
State模式主要解决的是在开发中时常遇到的根据不同的状态需要进行不同的处理操作的问题,而这样的问题,大部分人是采用switch-case语句进行处理的,这样会造成一个问题:分支过多,而且如果加入一个新的状态就需要对原来的代码进行编译。State模式采用了对这些不同的状态进行封装的方式处理这类问题,当状态改变的时候进行处理然后再切换到另一种状态,也就是说把状态的切换责任交给了具体的状态类去负责.同时,State模式和Strategy模式有很多相似的地方,需要说明的是两者的思想都是一致的,只不过封装的东西不同:State模式封装的是不同的状态,而Stategy模式封装的是不同的算法。
三、 结构图
State模式结构图如下:
 
四、 怎么使用?
1) 定义一个State接口,接口中有一个统一的方法,用以封装一个特定状态所对应的行为。
2) 定义具体不同状态类ConcreteSate实现State接口。
3) 每一个状态类都实现环境(Context)一个状态所对应的行为。
4) 定义一个状态管理器Context.
五、 一个例子
interface State{
 public void handle(Context ctx);
}
class ConcreteStateA implements State{

 public void handle(Context ctx) {
  System.out.println("handle by ConcreteStateA");
  if(ctx!=null){
   ctx.ChangeState(new ConcreteStateB());
  }
  
 }
 
}
class ConcreteStateB implements State{

 public void handle(Context ctx) {
  System.out.println("handle by ConcreteStateB");
  if(ctx!=null){
   ctx.ChangeState(new ConcreteStateA());
  }
  
 }
 
}
class Context{
 private State _state;
 public Context(State state){
  _state=state;
 }
 
 public void request(){
  if(_state!=null){
   _state.handle(this);
  }
 }
 public void ChangeState(State s){
  if(_state!=null){
   _state=null;
  }
  _state=s;
 }
}
public class StateClient {

 public static void main(String[] args) {
  State state=new ConcreteStateA();
  Context context=new Context(state);
  context.request();
  context.request();
  context.request();
  context.request();

 }

}
输出结果:
handle by ConcreteStateA
handle by ConcreteStateB
handle by ConcreteStateA
handle by ConcreteStateB

每请求一次,状态就更换一次,就执行对应的行为。

六、 适用性
1) 一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。
2) 一个对象含有庞大的条件分支语句,这些分支依赖于它的状态。这个状态通常用一个或多个枚举常量表示。通常有多个操作包含这一相同的结构。State模式将每一个分支放入一个独立的类中。这使得你可以根据对象自身的情况将对象的状态作为一个对象,这一对象可以不依赖于其他对象而独立变化。
七、 优缺点
1) 优点: 避免了为判断状态而产生的巨大的if或case语句。 将对象行为交给状态类维护后,对于上层程序而言,仅需要维护状态之间的转换规则。
2) 会导致某些系统有过多的具体状态类。
八、 参考
http://www.cppblog.com/converse/archive/2006/08/07/10902.html
http://www.blogjava.net/flying/archive/2006/08/29/66472.html


 

分享到:
评论

相关推荐

    设计模式学习笔记总结

    这里我们聚焦于C#语言中的设计模式学习笔记,涵盖了多种经典的设计模式,如合成模式、桥梁模式、装饰模式、享元模式、门面模式、命令模式、工厂方法、策略模式、代理模式以及状态模式。下面将对这些模式逐一进行详细...

    Head First 设计模式学习笔记(十四)模式的组合使用

    在《Head First 设计模式学习笔记(十四)模式的组合使用》中,作者探讨了如何在实际编程中灵活地组合多种设计模式以解决复杂问题。这篇文章可能是基于《Head First 设计模式》这本书的一个章节,该书是设计模式领域...

    设计模式学习笔记

    设计模式的学习不仅帮助我们编写更可维护、可扩展的代码,还能提高团队间的沟通效率,因为它们提供了通用的语言和解决方案。在实际开发中,灵活运用这些设计模式可以有效解决设计问题,提升代码质量。因此,深入理解...

    23中设计模式学习笔记.docx

    ### 23种设计模式学习笔记 #### 一、软件设计模式的概念与意义 **概念:** 软件设计模式(Software Design Pattern),又称设计模式,是一套被广泛采用、经过整理和分类的代码设计经验总结。它针对软件设计过程中...

    GoF 23种设计模式学习笔记

    "GoF 23种设计模式学习笔记" 是一个深入探讨这23个经典设计模式的资源,这些模式最初由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位作者在1994年的著作《设计模式:可复用面向对象软件的基础》中...

    《设计模式》学习笔记

    ### 设计模式学习笔记 #### 引言 设计模式(Design Patterns)是在软件设计领域内广泛应用的一种实践指南,它提供了一系列解决常见问题的方案。设计模式可以被理解为面向对象软件设计的经验总结,是对特定面向对象...

    300Java设计模式部分学习笔记

    以下是一些在尚学堂300Java设计模式部分学习笔记中涉及的设计模式的知识点: 创建型模式: 创建型模式主要解决对象创建的问题,确保系统的灵活性和封装创建细节。学习笔记中提到了5种创建型模式: 1. 单例模式...

    设计模式学习笔记--Flyweight享元模式.docx

    享元模式是一种设计模式,属于构造型模式,其主要目的是减少对象的数量,通过共享大量相似对象的内部状态来节省内存。这种模式在处理大量细粒度对象时特别有用,能够有效地提高系统的性能。 享元模式的核心是...

    23种面向对象设计模式

    文档中的“23种设计模式学习笔记.doc”可能包含了对这23种模式的详细解释和实例,而“设计模式之我爱我家.doc”可能从一个更生活化的角度来阐述设计模式的概念。“软件23种设计模式,超级经典的.pdf”可能是对这些...

    23个设计模式图解--学习笔记

    在《23个设计模式图解--学习笔记》中,我们探讨了这些模式,以便于理解和应用到实际开发中。以下是这23个设计模式的详细说明: 1. **工厂方法**(Factory Method):定义一个用于创建对象的接口,让子类决定实例化...

    台湾人写的设计模式笔记

    通过阅读这份笔记,读者不仅可以学习到设计模式的基本概念,还能了解到如何在Java环境中实际运用这些模式,提升编程技能。设计模式的学习和掌握是成为一名优秀程序员的必经之路,它们能帮助我们写出更高效、更灵活、...

    设计模式的读书总结笔记

    总之,“设计模式的读书总结笔记”是一份宝贵的资源,它可以帮助开发者系统地学习和掌握设计模式,提升软件设计的质量和效率。无论是初学者还是经验丰富的开发者,都可以从中受益匪浅。通过深入学习和实践,我们可以...

    《设计模式:可复用面向对象软件的基础》学习并理解 23 种设计模式

    学习设计模式对于软件开发人员来说至关重要,主要基于以下几点理由: - **经验借鉴**:设计模式是基于众多专家的经验和智慧,提供了经过实践检验的解决方案。 - **提高可维护性和可复用性**:通过遵循已知的最佳...

    Java设计模式尚硅谷笔记

    本笔记主要涵盖了多种经典的设计模式,以下是对这些模式的详细解释: 1. 单例模式(Singleton):确保一个类只有一个实例,并提供全局访问点。在Java中,通常通过双重检查锁定(Double-Check Locking)或静态内部类...

    图解Java设计模式笔记总结word版本.rar

    5. **学习设计模式的意义** - 提高代码的可读性和可维护性,使得其他人更容易理解和修改代码。 - 提升软件设计质量,避免重复造轮子,提高开发效率。 - 有助于软件架构师进行系统设计,使系统更加灵活、可扩展。 ...

    23种设计模式的解析与Cpp实现

    设计模式是软件工程中的一种重要概念,它代表了在特定情境下解决常见问题的最佳实践。...通过“23种设计模式的解析与C++实现.pdf”和“Source”文件,读者可以深入学习并实践这些模式,提升自己的编程技能。

    设计模式笔记设计模式笔记

    设计模式笔记是对这些模式的深入理解和应用记录,可以帮助开发者在面对复杂系统设计时,快速找到合适的结构和策略。以下是关于设计模式的一些核心知识点: 1. **设计模式的分类**: - 创建型模式:如单例...

    java23种设计模式,3套视频加1个ppt

    Java设计模式是软件开发中的重要概念,它是一种在特定情境下解决问题的经验总结,可以提高代码的可重用性、灵活性和可维护性。...通过学习这些设计模式,开发者可以写出更优雅、更具扩展性的代码,提升软件工程的水平。

    Head First 设计模式 扫描版

    尽管扫描版可能不如实体书方便翻阅和做笔记,但它仍然可以让读者随时随地进行学习,加深对设计模式的理解和应用。 总的来说,《Head First 设计模式》是一本值得每一个程序员拥有的书籍,无论你是初学者还是经验...

Global site tag (gtag.js) - Google Analytics