一. 狀態模式
允許一個對象在其內部狀態改變時改變它的行為.這個對象看起來似乎修改了它的類.看起來,狀態模式好像是神通廣大--居然可以修改自身的類!
二. 狀態模式包括三個角色:
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.測試結果如下:
相关推荐
根据给定文件内容,以下是关于Java设计模式的知识点说明: 1. 策略模式(Strategy Pattern)是一种行为设计模式,允许在运行时选择算法的行为。策略模式的意图是定义一系列算法,将每个算法封装起来,并使它们可以...
Java设计模式是软件开发中的一种最佳实践,它总结了在解决特定问题时程序员们经常采用的有效方法。这个“JAVA设计模式-chm版”资源显然包含了关于Java设计模式的详细信息,便于理解和应用。设计模式是对常见问题的...
今天,我们将讨论两种常用的Java设计模式:状态模式和模板模式。 状态模式(State Pattern) --------------------- 状态模式是一种行为型设计模式,它允许对象在内部状态改变时改变它的行为。状态模式将状态封装...
总结来说,"JAVA design pattern-java设计模式"的CHM文件是深入学习和理解Java设计模式的宝贵资源,通过学习和应用这些模式,开发者可以提高其代码质量,优化系统架构,从而更好地应对复杂的软件开发挑战。
8. **工具应用**:在实际开发中,状态模式常常与其他设计模式结合使用,如工厂模式用于创建状态对象,策略模式用于更灵活的状态行为选择。此外,一些现代编程语言提供了枚举类或类似功能,可以简化状态模式的实现。 ...
十一个行为型模式 状态模式-State Pattern 处理对象的多种状态及其相互转换——状态模式(一) 处理对象的多种状态及其相互转换——状态模式(二) 处理对象的多种状态及其相互转换——状态模式(三) 处理对象的...
Java设计模式中的备忘录模式(Memento Pattern)是一种用于保存对象状态的模式,以便在未来某一时刻能够恢复到之前的状态。这种模式的核心在于在不违反对象封装性的前提下,捕获对象的内部状态并将其存储起来。备忘...
- **State接口**:定义状态行为。 - **具体状态类**:实现State接口,如`StartState`和`StopState`。 - **Context类**:维护一个状态对象,并提供更改状态的方法。 ```java // 定义状态接口 public interface State...
【JAVA设计模式】在软件开发中,设计模式是解决常见问题的经验总结,它们提供了一种在特定场景下高效、可扩展的解决方案。本篇将探讨两种重要的行为设计模式:责任链模式(Chain of Responsibility Pattern)和状态...
《Java设计模式实战详解》 在Java编程领域,设计模式是一种通用、可重用的解决方案,用于解决在软件设计中常见的问题。这个压缩包“java-design-patterns-master”显然是一个专注于Java设计模式的学习资源,旨在...
在Java设计模式中,主要分为三大类:创建型模式、结构型模式和行为型模式。创建型模式如单例(Singleton)、工厂方法(Factory Method)、抽象工厂(Abstract Factory)、建造者(Builder)和原型(Prototype),...
### Java设计模式(第二版)中文版 #### 思维框架的培养;对新手与码农均适用 在软件开发领域,设计模式是一种被广泛采用的解决方案,它可以帮助开发者更好地组织代码、解决常见问题,并提高软件的整体质量和可维护...
根据提供的文档信息,我们可以从这份《Java设计模式》模拟试题参考答案及评分标准中提炼出以下关键知识点: ### 一、基础知识与概念 #### 1. 设计模式基础概念 - **里氏替换原则**(Liskov Substitution Principle...
状态模式(State Pattern)是一种行为设计模式,它允许对象在其内部状态改变时改变其行为,从而使对象看起来像改变了其类。这种模式的主要目的是将对象的状态作为独立的类来管理,从而简化了条件逻辑并提高了代码的...
Java设计模式是软件工程中的一种最佳实践,它们是解决常见编程问题的经验总结,可以提高代码的可重用性、可维护性和可扩展性。在"design-pattern.zip"这个压缩包中,我们很可能会找到一系列与Java设计模式相关的代码...
这个名为"design-pattern:java设计模式源代码"的压缩包文件很可能是包含了多种Java实现的设计模式示例。 首先,我们来看看主要的设计模式分类: 1. 创建型模式:这类模式涉及到对象的创建,如单例模式(Singleton...
这里我们关注的是一个名为"pattern.zip"的压缩包文件,它包含了23种经典的设计模式,这些模式在实践中被广泛使用,提高了代码的可读性、可维护性和可扩展性。这篇文章将详细探讨这些设计模式及其应用。 首先,23种...
备忘录模式(Memento Pattern)是一种行为设计模式,它允许在不破坏封装性的情况下捕获和恢复对象的内部状态。该模式通常用于需要撤销操作或恢复先前状态的情况下。备忘录模式包括三个主要组件:原始对象、备忘录...
在《Java设计模式》这本书的模拟试题及其参考答案中,涉及了多条设计模式的知识点,以及它们的应用场景和实现方法。现在将这些知识点详细地解释如下: 1. 开闭原则(Open-Closed Principle, OCP): 开闭原则是面向...