一. 狀態模式
允許一個對象在其內部狀態改變時改變它的行為.這個對象看起來似乎修改了它的類.看起來,狀態模式好像是神通廣大--居然可以修改自身的類!
二. 狀態模式包括三個角色:
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.測試結果如下:
相关推荐
十一个行为型模式 状态模式-State Pattern 处理对象的多种状态及其相互转换——状态模式(一) 处理对象的多种状态及其相互转换——状态模式(二) 处理对象的多种状态及其相互转换——状态模式(三) 处理对象的...
状态模式(State Pattern) 空对象模式(Null Object Pattern) 策略模式(Strategy Pattern) 模板模式(Template Pattern) 访问者模式(Visitor Pattern) 4 J2EE 模式 这些设计模式特别关注表示层。这些模式是由...
Java高手真经 - Java Web系统设计与架构 源代码(一)设计模式 (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1...
用Java实现23种设计模式 1. 创建型模式 工厂模式(Factory Pattern) 抽象工厂模式(Abstract Factory Pattern) 单例模式(Singleton Pattern) 建造者模式(Builder Pattern) 原型模式(Prototype Pattern)...
CoreJava-DesignPattern 创意设计模式 -- Abstract Factory - ...行为设计模式 -- Chain of Responsibility -- Command -- Interpreter -- Iterator -- Mediator -- Memento -- Null Object -- Observer -- State --
在个人自学阶段的23种设计模式代码的全部实现,全部使用Java编写,其中还包括各个设计模式在源码中的使用,每种设计模式都举了一个简单的小例子来进行实现,并加以注释 包名解释 一、DesignPattern 1.1 创建型模式 ...
Java设计模式,关于状态机。Java设计模式,关于状态机。Java设计模式,关于状态机。Java设计模式,关于状态机。Java设计模式,关于状态机。
Java设计模式学习教程与案例源码.zip 设计模式 ======= [设计模式专题](http://94275.cn/categories/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/) ### 创建型 1. [工厂方法](worthed/OriginBlog/blob/master/...
综合实例——Bug管理系统 (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1工厂方法模式 pattern/src/creation/...
附件中是java实现全部的设计模式,包含代码和工程(jbuilder工程),值得收藏. 此目录里包括了一书中所有23种设计模式的实现(Java 版)源码 关于代码的几点说明: 1. 代码为根据个人对Design Pattern的学习理解写...
综合实例——Bug管理系统 (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1工厂方法模式 pattern/src/creation/...
,示例有限状态机代表了电路设计问题的解决方案。 (问题是要跟踪输入的总和是否为3的倍数。输入是无符号的2位整数。)用Java实现此计算机。 定义一个MultiplesOf3类,该类支持一个函数computeY(String input),...
5.8StatePattern(状态模式) 248 5.8.1定义 248 5.8.2现实例子——心情好坏 250 5.8.3C#实例——账户分类 250 5.8.4Java实例——汽车的变速档 258 5.8.5优势和缺陷 261 5.8.6应用情景 261 5.9...
Android源码设计模式解析与实战读书笔记源代码 说明: 包名factorypattern.normal表示的是工厂方法模式的普通用法 包名factorypattern.practices表示的是工厂方法模式的常用 包名observerpattern表示的是观察者模式...
5.8StatePattern(状态模式) 248 5.8.1定义 248 5.8.2现实例子——心情好坏 250 5.8.3C#实例——账户分类 250 5.8.4Java实例——汽车的变速档 258 5.8.5优势和缺陷 261 5.8.6应用情景 261 5.9...
(3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1工厂方法模式 pattern/src/creation/abstractfactory //11.2抽象...
(3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1工厂方法模式 pattern/src/creation/abstractfactory //11.2抽象...
综合实例——Bug管理系统 (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1工厂方法模式 pattern/src/creation/...
家庭作业的主题: HW01: PART1->策略设计模式PART2->观察者设计模式PART3->装饰器设计模式HW02: PART1->单例设计模式PART2->迭代器设计模式PART3->状态和观察者模式PART4->代理设计模式中期: PART1->抽象工厂...
综合实例——Bug管理系统 (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1工厂方法模式 pattern/src/creation/...