`

java设计模式--[行为模式]--状态模式[state pattern]

阅读更多

一. 狀態模式

     允許一個對象在其內部狀態改變時改變它的行為.這個對象看起來似乎修改了它的類.看起來,狀態模式好像是神通廣大--居然可以修改自身的類!

  

二. 狀態模式包括三個角色:

1. 環境: 環境是一個類,該類含有抽象狀態聲明的變量,可以引用任何具體狀態類的實例.

2. 抽象狀態: 抽象狀態是一個接口或抽象類,定義了與環境的一個特定狀態相關的若干方法.

3.具體狀態: 具體狀態是實現(擴展)旬狀態(抽象類)的類.

 

三. 狀態模式的UML類圖如下:

 

四. 下面以一個冬簡單的實例來說明狀態的切換:

      一個彈夾可以裝3顆子彈,每次發射一顆,全發射完后,可以重新裝滿3顆子彈,其狀態轉換圖如下所示:


 

五. 完整的示例代碼如下:

 

1. 環境類:

package behavioralPattern.state.state1;

/**
 * @ClassName: Gun
 * @Description:槍類[context]
 * @author Liyongbin
 * @date 2011-2-9 下午05:07:17
 * @version V1.0
 */
public class Gun {
	
	private IState state, state0, state1, state2, state3;
	
	public Gun() {
		//無子彈
		state0 = new State0Bullet(this);
		//1顆子彈
		state1 = new State1Bullet(this);
		//2顆子彈
		state2 = new State2Bullet(this);
		//3顆子彈
		state3 = new State3Bullet(this);
		//默認情況下有3顆子彈
		state = state3;
	}

	//發射子彈
	public void fire(){
		state.fire();
	}
	public IState getState() {
		return state;
	}

	public void setState(IState state) {
		this.state = state;
	}

	public IState getState0() {
		return state0;
	}

	public void setState0(IState state0) {
		this.state0 = state0;
	}

	public IState getState1() {
		return state1;
	}

	public void setState1(IState state1) {
		this.state1 = state1;
	}

	public IState getState2() {
		return state2;
	}

	public void setState2(IState state2) {
		this.state2 = state2;
	}

	public IState getState3() {
		return state3;
	}

	public void setState3(IState state3) {
		this.state3 = state3;
	}
}

 

2.   抽象狀態類:

package behavioralPattern.state.state1;
/**
 * @ClassName: IState 
 * @Description:狀態[State]
 * @author Liyongbin
 * @date 2011-2-9 下午05:08:49 
 * @version V1.0
 */
public interface IState {
	//發射
	public void fire();
	//裝子彈
	public void loadBullet();
	//顯示狀態信息
	public String message();
}

3.   無子彈狀態

package behavioralPattern.state.state1;

/**
 * @ClassName: State2Bullet
 * @Description:無子彈狀態
 * @author Liyongbin
 * @date 2011-2-9 下午05:15:56
 * @version V1.0
 */
public class State0Bullet implements IState {

	private Gun gun;

	public State0Bullet(Gun gun) {
		this.gun = gun;
	}

	//發射子彈
	@Override
	public void fire() {
		//當前的狀態
		System.out.print("裝滿三顆子彈!");
		//獲取下一個狀態
		this.gun.setState(gun.getState3());
		//輸出要進入狀態的信息
		System.out.println("進入"+"["+gun.getState3().message()+"]");
	}
	
	//能否裝彈
	@Override
	public void loadBullet() {
		System.out.println("可以裝子彈.");
	}

	//當前狀態信息
	@Override
	public String message() {
		return "無顆子彈狀態";
	}
}

 

4.  1顆子彈狀態

package behavioralPattern.state.state1;

/**
 * @ClassName: State1Bullet
 * @Description:1顆子彈狀態
 * @author Liyongbin
 * @date 2011-2-9 下午05:16:10
 * @version V1.0
 */
public class State1Bullet implements IState {

	private Gun gun;

	public State1Bullet(Gun gun){
		this.gun = gun;
	}
	
	//發射子彈
	@Override
	public void fire() {
		//當前的狀態
		System.out.print("射出最后一顆子彈!");
		//獲取下一個狀態
		this.gun.setState(gun.getState0());
		//輸出要進入狀態的信息
		System.out.println("進入"+"["+gun.getState0().message()+"]");
	}
	
	//能否裝彈
	@Override
	public void loadBullet() {
		System.out.println("不能裝子彈.");
	}

	//當前狀態信息
	@Override
	public String message() {
		return "1顆子彈狀態";
	}
}

 

5.  2顆子彈狀態

package behavioralPattern.state.state1;
/**
 * @ClassName: State2Bullet 
 * @Description:2顆子彈狀態
 * @author Liyongbin
 * @date 2011-2-9 下午05:15:56 
 * @version V1.0
 */
public class State2Bullet implements IState {
	private Gun gun;
	
	public State2Bullet(Gun gun){
		this.gun = gun;
	}
	
	//發射子彈
	@Override
	public void fire() {
		//當前的狀態
		System.out.print("射出一顆子彈!");
		//獲取下一個狀態
		this.gun.setState(gun.getState1());
		//輸出要進入狀態的信息
		System.out.println("進入"+"["+gun.getState1().message()+"]");
	}
	
	//能否裝彈
	@Override
	public void loadBullet() {
		System.out.println("不能裝子彈.");
	}

	//當前狀態信息
	@Override
	public String message() {
		return "2顆子彈狀態";
	}
}

 

6.  3顆子彈狀態

package behavioralPattern.state.state1;
/**
 * @ClassName: State3Bullet 
 * @Description:3顆子彈狀態
 * @author Liyongbin
 * @date 2011-2-9 下午05:15:26 
 * @version V1.0
 */
public class State3Bullet implements IState {
	private Gun gun;
	
	public State3Bullet(Gun gun){
		this.gun = gun;
	}
	
	
	//發射子彈
	@Override
	public void fire() {
		//當前的狀態
		System.out.print("射出一顆子彈!");
		//獲取下一個狀態
		this.gun.setState(gun.getState2());
		//輸出要進入狀態的信息
		System.out.println("進入"+"["+gun.getState2().message()+"]");
	}
	
	//能否裝彈
	@Override
	public void loadBullet() {
		System.out.println("不能裝子彈.");
	}

	//當前狀態信息
	@Override
	public String message() {
		return "3顆子彈狀態";
	}
}

 

7.   測試類

package behavioralPattern.state.state1;
/**
 * @ClassName: StateTest 
 * @Description:狀態模式測試
 * @author Liyongbin
 * @date 2011-2-9 下午06:01:21 
 * @version V1.0
 */
public class StateTest {
	public static void main(String[] args) {
		Gun gun = new Gun();
		gun.fire();
		gun.fire();
		gun.fire();
		gun.fire();
		gun.fire();
		gun.fire();
		gun.fire();
	}
}

 

8.測試結果如下:

  • 大小: 21.1 KB
  • 大小: 12.3 KB
  • 大小: 21.2 KB
分享到:
评论

相关推荐

    java设计模式---诙谐易懂版

    根据给定文件内容,以下是关于Java设计模式的知识点说明: 1. 策略模式(Strategy Pattern)是一种行为设计模式,允许在运行时选择算法的行为。策略模式的意图是定义一系列算法,将每个算法封装起来,并使它们可以...

    JAVA设计模式-chm版

    Java设计模式是软件开发中的一种最佳实践,它总结了在解决特定问题时程序员们经常采用的有效方法。这个“JAVA设计模式-chm版”资源显然包含了关于Java设计模式的详细信息,便于理解和应用。设计模式是对常见问题的...

    java常用设计模式-状态模式

    今天,我们将讨论两种常用的Java设计模式:状态模式和模板模式。 状态模式(State Pattern) --------------------- 状态模式是一种行为型设计模式,它允许对象在内部状态改变时改变它的行为。状态模式将状态封装...

    JAVA design pattern-java设计模式

    总结来说,"JAVA design pattern-java设计模式"的CHM文件是深入学习和理解Java设计模式的宝贵资源,通过学习和应用这些模式,开发者可以提高其代码质量,优化系统架构,从而更好地应对复杂的软件开发挑战。

    《设计模式》实战---状态模式(State Pattern)

    8. **工具应用**:在实际开发中,状态模式常常与其他设计模式结合使用,如工厂模式用于创建状态对象,策略模式用于更灵活的状态行为选择。此外,一些现代编程语言提供了枚举类或类似功能,可以简化状态模式的实现。 ...

    design-pattern-java.pdf

    十一个行为型模式 状态模式-State Pattern 处理对象的多种状态及其相互转换——状态模式(一) 处理对象的多种状态及其相互转换——状态模式(二) 处理对象的多种状态及其相互转换——状态模式(三) 处理对象的...

    java设计模式-备忘录模式

    Java设计模式中的备忘录模式(Memento Pattern)是一种用于保存对象状态的模式,以便在未来某一时刻能够恢复到之前的状态。这种模式的核心在于在不违反对象封装性的前提下,捕获对象的内部状态并将其存储起来。备忘...

    状态模式 State Pattern

    - **State接口**:定义状态行为。 - **具体状态类**:实现State接口,如`StartState`和`StopState`。 - **Context类**:维护一个状态对象,并提供更改状态的方法。 ```java // 定义状态接口 public interface State...

    JAVA设计模式之行为模式 责任链模式和状态模式

    【JAVA设计模式】在软件开发中,设计模式是解决常见问题的经验总结,它们提供了一种在特定场景下高效、可扩展的解决方案。本篇将探讨两种重要的行为设计模式:责任链模式(Chain of Responsibility Pattern)和状态...

    java-design-patterns-master_JAVAdesignpattens_java_design_

    《Java设计模式实战详解》 在Java编程领域,设计模式是一种通用、可重用的解决方案,用于解决在软件设计中常见的问题。这个压缩包“java-design-patterns-master”显然是一个专注于Java设计模式的学习资源,旨在...

    design-pattern-Java设计模式

    在Java设计模式中,主要分为三大类:创建型模式、结构型模式和行为型模式。创建型模式如单例(Singleton)、工厂方法(Factory Method)、抽象工厂(Abstract Factory)、建造者(Builder)和原型(Prototype),...

    Java设计模式(第二版)中文版

    ### Java设计模式(第二版)中文版 #### 思维框架的培养;对新手与码农均适用 在软件开发领域,设计模式是一种被广泛采用的解决方案,它可以帮助开发者更好地组织代码、解决常见问题,并提高软件的整体质量和可维护...

    《Java设计模式》模拟试题参考答案及评分标准-刘伟(20180723).pdf

    根据提供的文档信息,我们可以从这份《Java设计模式》模拟试题参考答案及评分标准中提炼出以下关键知识点: ### 一、基础知识与概念 #### 1. 设计模式基础概念 - **里氏替换原则**(Liskov Substitution Principle...

    设计模式-状态模式.pdf

    状态模式(State Pattern)是一种行为设计模式,它允许对象在其内部状态改变时改变其行为,从而使对象看起来像改变了其类。这种模式的主要目的是将对象的状态作为独立的类来管理,从而简化了条件逻辑并提高了代码的...

    这是一套 Java 设计模式的集合示例-design-pattern.zip

    Java设计模式是软件工程中的一种最佳实践,它们是解决常见编程问题的经验总结,可以提高代码的可重用性、可维护性和可扩展性。在"design-pattern.zip"这个压缩包中,我们很可能会找到一系列与Java设计模式相关的代码...

    设计模式java源码-design-pattern:java设计模式源代码

    这个名为"design-pattern:java设计模式源代码"的压缩包文件很可能是包含了多种Java实现的设计模式示例。 首先,我们来看看主要的设计模式分类: 1. 创建型模式:这类模式涉及到对象的创建,如单例模式(Singleton...

    设计模式整理代码-pattern.zip

    这里我们关注的是一个名为"pattern.zip"的压缩包文件,它包含了23种经典的设计模式,这些模式在实践中被广泛使用,提高了代码的可读性、可维护性和可扩展性。这篇文章将详细探讨这些设计模式及其应用。 首先,23种...

    java常用设计模式-备忘录模式

    备忘录模式(Memento Pattern)是一种行为设计模式,它允许在不破坏封装性的情况下捕获和恢复对象的内部状态。该模式通常用于需要撤销操作或恢复先前状态的情况下。备忘录模式包括三个主要组件:原始对象、备忘录...

    Java设计模式刘伟书本中模拟考试答案

    在《Java设计模式》这本书的模拟试题及其参考答案中,涉及了多条设计模式的知识点,以及它们的应用场景和实现方法。现在将这些知识点详细地解释如下: 1. 开闭原则(Open-Closed Principle, OCP): 开闭原则是面向...

Global site tag (gtag.js) - Google Analytics