`
zy19982004
  • 浏览: 661814 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
F6f66edc-1c1a-3859-b76b-a22e740b7aa7
Hadoop学习
浏览量:251950
社区版块
存档分类
最新评论

设计模式学习十四:状态模式

阅读更多

一.概念

     状态模式:当一个对象的内在状态改变时允许改变其行为,看起来就像是修改这个类。

 

二.UML

 

  1. Context(应用场景),持有State对象的引用。不管在任何时候,只有有人调用Context的request方法,它就会被委托到对应的状态来处理。
  2. State(具体对象的共同接口),任何状态实现类都实现这一接口,做到状态之间的互相切换。
  3. ConcreteStrategryA-C(状态实现类),ConcreteState处理来自Context的请求,每个ConcreteState都提供了它自己对于请求的实现。所以,当Context改变状态时行为也跟着改变。即状态决定行为。

 

三.实例分析

     上次回家把驾照给拿了。科目一二去年就过了,这次就考了科目三(路考)。先说点科目三相关的知识,科目三要在1500M内从1挡到5挡,每档有时间速度限制;其它的知识的一些与状态模式无关就不谈。因为工作的原因,没时间学,找了点关系,请人吃了饭,送了礼。最后考试的时候,我就上了个车意思了下,什么都没做,车子开完1500M我就下车了,都不知道这1档到5档是怎么跑下来的...重点来了:我作为一个路考着,对1档到5档这些状态的变化浑然不觉。又一个马路杀手来了啊。

     从这个里面,我们可以抽象出这样的几个类:

     Gears1-5:具体档位

 

    RoadRiver:路考者

package com.zzy.state;

/**
 * 路考者
 * 相当于Context
 * @author eason
 *
 */
public class RoadRiver {
	
	//路考者持有档位这个对象
	private Gears gears;
	
	public RoadRiver(Gears gears) {
		this.gears = gears;
	}

	//路考着开车
	public void drive() {
		gears.drive(this);
	}	
	
	public void setGears(Gears gears) {
		this.gears = gears;
	}
}

 

    Gears:档位接口

package com.zzy.state;

public interface Gears {
	public void drive(RoadRiver rd);
}

 

    Gears0:档位0。 Gears1-5同Gears0,在drive方法里面切换到下一档位。

package com.zzy.state;

/**
 * 档位0
 * @author eason
 *
 */
public class Gears0 implements Gears{
	
	public void drive(RoadRiver rd) {
		System.out.println("准备起步");
		//这里就是状态模式的核心了
		//从0切换到1挡,在此完成
		rd.setGears(new Gears1());
	}
	
}

 

    RoadDriverTest

package com.zzy.state;

/**
 * 测试类
 * @author eason
 *
 */
public class RoadDiverTest {

	public static void main(String[] args) {
		Gears gears0 = new Gears0();
		//路考着从0档开始
		RoadRiver rd = new RoadRiver(gears0);
		//这里就是状态模式的核心了
		//路考着看似什么都没做,实际上已经从0切换到1挡了
		rd.drive();   
		rd.drive();
		rd.drive();
		rd.drive();
		rd.drive();
		rd.drive();
	}

}

 

四.实例分析条件控制代码

     Gears

package com.zzy.state.base;

/**
 * 档位
 * 0-5挡
 * @author eason
 *
 */
public enum Gears {
	G0, G1, G2, G3, G4, G5
}

 

    RoadDiver 最好用switch case啦

package com.zzy.state.base;

/**
 * 路考者
 * @author eason
 *
 */
public class RoadDiver {
	
	private Gears gears;
	
	public RoadDiver(Gears gears) {
		this.gears = gears;
	}
	
	public void setGears(Gears gears) {
		this.gears = gears;
	}

	public void drive() {
		if(gears == Gears.G0) {
			System.out.println("准备起步");
		}if(gears == Gears.G1) {
			System.out.println("1挡行驶中,速度15码左右,在20米内换成2挡");
		}else if(gears == Gears.G2) {
			System.out.println("2挡行驶中,速度25码左右,在50米内换成3挡");
		}else if(gears == Gears.G3) {
			System.out.println("3挡行驶中,速度35码左右,保持直线行驶3秒");
		}else if(gears == Gears.G4) {
			System.out.println("4挡行驶中,速度45码左右");
		}else if(gears == Gears.G5) {
			System.out.println("5挡行驶中,请保持50码到60码行驶3秒");
		}
	}

}

 

   RoadDriverTest

package com.zzy.state.base;

public class RoadDiverTest {

	public static void main(String[] args) {
		RoadDiver rd = new RoadDiver(Gears.G0);
		
		rd.drive();
		rd.setGears(Gears.G1);
		rd.drive();
		rd.setGears(Gears.G2);
		rd.drive();
		rd.setGears(Gears.G3);
		rd.drive();
		rd.setGears(Gears.G4);
		rd.drive();
		rd.setGears(Gears.G5);
		rd.drive();
	}

}
 

 

五.使用场景及使用感受

  1. 将特定的状态相关的行为都放入一个对象中,由于所有与状态相关的代码都存在于某个ConcreteState中,所有通过定义新的子类都可以很容易地增加新的状态和转换。
  2. 消除了庞大的条件分支语句。将一个个状态封装变成一个个ConcreteState,并将动作委托到代表当前状态的对象。
  3. 当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态来改变它的行为时,考虑状态模式。
  4. ConcreteState总是决定接下来的状态是什么吗?不一定。Context也可以决定状态转换的流向。一般来说,当状态转换是固定的时候,适合放在Context中;然而,当状态转换是固定的时候,就通常放在状态类中。

六.状态模式与策略模式

 

  1. 都是利用多态把一些操作分配到一组类中。
  2. 状态模式是完全封装且自修改的策略模式。
  3. 状态模式:Context的行为随时可以委托到那些状态对象中的一个,这些委托往往发生在Context内部。使用Context的客户对这些状态的转变了解不多,甚至是浑然不觉的。
  4. 策略模式:客户通常主动指定Context需要的策略。固然策略模式可以在运行时改变策略,当对于某个context对象来说,通常都只有一个最适合的策略对象。
分享到:
评论

相关推荐

    设计模式之:状态模式

    状态模式是一种行为设计模式,它允许对象在内部状态改变时改变其行为,对象看起来似乎修改了它的类。这种模式常用于处理对象的状态变化,使得对象的行为与其状态紧密相关,而状态之间的转换则通过上下文对象来实现。...

    设计模式C++学习之状态模式(State)

    状态模式是一种行为设计模式,它允许对象在内部状态改变时改变其行为,对象看起来似乎修改了它的类。这种模式常用于处理对象的状态变化,并且使代码结构清晰,易于维护。 在C++中,状态模式通常包含以下几个关键...

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

    《设计模式:可复用面向对象软件的基础》一书介绍了23种经典的设计模式,这些模式大致可以分为三大类: 1. **创建型模式**:专注于对象的创建机制,确保系统在合适的时机创建正确的对象。 - **单例模式**...

    设计模式学习报告

    ### 设计模式学习报告 #### 一、设计模式概述 设计模式是一种被广泛接受和使用的编程解决方案,旨在解决软件设计中的常见问题。它不仅能够帮助开发者编写出更易于理解和维护的代码,还能够促进代码的复用性。设计...

    设计模式学习笔记总结

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

    设计模式学习 ppt

    这个“设计模式学习ppt”资料包显然是一份面向初学者或大学生的教学资源,通过十四个PPT文件深入浅出地讲解了设计模式的各个方面。 首先,我们来看设计模式的基本概念。设计模式是对在特定上下文中反复出现的问题...

    设计模式23种类图

    设计模式是软件工程中的一种最佳实践,用于解决在软件开发过程中常见的问题。这些模式是经验丰富的开发者们在解决相似...学习和掌握这些设计模式,对于提升软件开发的专业技能,以及团队间的沟通效率都有着显著的帮助。

    设计模式:可复用面向对象软件的基础(非扫描版+高清)

    对于初学者,可以从理解设计模式的基本概念开始,然后通过实例学习和练习各种模式,接着深入研究C++如何实现这些模式,最后结合实际项目应用,巩固和提升设计模式的运用能力。 总之,《设计模式:可复用面向对象...

    《设计模式》中文版

    设计模式是软件工程中的一种重要概念,它代表了在特定情境下解决常见问题的...通过学习和实践这些设计模式,开发者可以更好地应对软件开发中的各种挑战,提高代码复用性,降低系统耦合度,使得代码更加易于理解和修改。

    设计模式可复用面向对象软件的基础 源码

    设计模式是软件工程中的一种重要概念,它代表了在特定情境下解决常见问题的最佳实践。...通过深入学习和实践这些设计模式,开发者可以提高代码的可读性、可维护性和可扩展性,从而提升软件工程的效率和质量。

    设计模式可复用面向对象软件的基础(PDF,学习设计模式必备)

    这本书由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位作者编写,是设计模式领域的权威之作。 书中介绍了23种设计模式,这些模式可以分为三类:创建型模式(Creational Patterns)、结构型模式...

    设计模式状态模式PPT学习教案.pptx

    状态模式的定义为:状态模式:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。 状态模式的优点是: 1. 状态模式可以使得系统中的对象能够根据不同的状态表现出不同的行为,提高了系统...

    设计模式精解-GoF-23种设计模式解析--附C++源代码

    这些模式是由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位大师,通常被称为GoF(Gang of Four),在他们的经典著作《设计模式:可复用面向对象软件的基础》中提出的。这本书详细阐述了23种设计...

    设计模式的状态模式的例子

    状态模式是一种行为设计模式,它允许对象在其内部状态改变时改变其行为,使得对象看起来好像修改了它的类...通过对"设计模式的状态模式的例子"的学习,我们可以更好地理解和应用这个模式,从而提高我们的软件设计能力。

    java23种设计模式详解+源码(绝对详解)

    通过学习这些设计模式,你可以提高代码的可读性、可维护性和复用性,同时提升软件开发的效率。每种模式都有其特定的应用场景,理解这些模式的核心思想和使用场景是关键。提供的源码和图文并茂的注解将帮助你更直观地...

    设计模式PPT---25种设计模式详解

    它们源于实际的编程经验,由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位大师在其经典著作《设计模式:可复用面向对象软件的基础》中首次系统地提出。 这25种设计模式通常被分为三大类:创建型...

    第二十四讲:状态模式

    在实际应用中,我们通常通过以下步骤实现状态模式: 1. 定义上下文接口:首先,我们需要创建一个接口或抽象类,这个接口定义了所有可能的操作,这些操作可能会引起状态的变化。例如,我们可以定义一个`StateMachine...

    24种设计模式以及混合设计模式

    通过学习和应用这些设计模式,开发者不仅可以提高代码的可读性、可维护性和可扩展性,还能提升团队间的沟通效率,因为设计模式是软件工程中的通用语言。对于任何有志于提升软件开发水平的人来说,理解和掌握设计模式...

    《设计模式:可复用面向对象软件的基础》英文版

    《设计模式:可复用面向对象软件的基础》是一本由Erich Gamma、Richard Helm等四位国际知名的软件工程师共同编写的经典之作,该书提供了面向对象软件设计中常用的模式,并通过具体的案例解释了这些模式如何帮助解决...

Global site tag (gtag.js) - Google Analytics