Java中的状态模式实例教程

原文链接 作者:Pankaj Kumar 译者:f0tlo <1357654289@qq.com>

状态模式是一种行为设计模式。适用于当对象的内在状态改变它自身的行为时。

如果想基于对象的状态来改变自身的行为,通常利用对象的状态变量及if-else条件子句来扮演针对对象的不同行为。状态模式Context(环境)State(状态)分离的方式既保证状态与行为的联动变化,又使得这种变化是条理明晰且松耦合的。

Context是包含了状态引用的类,此引用指向一个状态的具体实现。并且帮助把对状态的请求委托给此状态的对象进行处理。看一个具体的例子。

假如想实现电视遥控器,使用简单按键来表现动作。如果状态是ON,电视将被打开,如果状态是OFF,电视将被关闭。

利用if-else条件子句来实现。

package com.journaldev.design.state;

public class TVRemoteBasic {

 private String state="";

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

 public void doAction(){
 if(state.equalsIgnoreCase("ON")){
 System.out.println("TV is turned ON");
 }else if(state.equalsIgnoreCase("OFF")){
 System.out.println("TV is turned OFF");
 }
 }

 public static void main(String args[]){
 TVRemoteBasic remote = new TVRemoteBasic();

 remote.setState("ON");
 remote.doAction();

 remote.setState("OFF");
 remote.doAction();
 }

}

注意:客户端代码需要知道每一个不同的值所代表的遥控器的不同状态。如果这样,假如大量的状态被增加,那么对于被紧紧捆绑在一起的状态实现以及相应的客户端代码,它们的维护及扩展就变得非常困难。

现在使用状态模式实现上述电视控制器。

抽象State接口

首先创建一个状态接口来定义一个方法,此方法需要被不同的具体状态类以及环境类实现。

package com.journaldev.design.state;

public interface State {

 public void doAction();
}

具体State实现

自此例子中,包含两个状态:一个是打开电视的状态,一个关闭电视的状态。因此,需要创建两个具体状态类代表这两个行为。

package com.journaldev.design.state;

public class TVStartState implements State {

 @Override
 public void doAction() {
 System.out.println("TV is turned ON");
 }

}
package com.journaldev.design.state;

public class TVStopState implements State {

 @Override
 public void doAction() {
 System.out.println("TV is turned OFF");
 }

}

现在我们开始实现Context对象,能改基于内在对象来改变自身的行为。

Context类实现

package com.journaldev.design.state;

public class TVContext implements State {

 private State tvState;

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

 public State getState() {
 return this.tvState;
 }

 @Override
 public void doAction() {
 this.tvState.doAction();
 }

}

注意,Context类实现了状态以及保持了对此状态的引用。它能够把对此状态的请求委托到某一具体状态实现中。

测试程序

完成一个简单地程序对使用状态模式的电视遥控器的测试。

package com.journaldev.design.state;

public class TVRemote {

 public static void main(String[] args) {
 TVContext context = new TVContext();
 State tvStartState = new TVStartState();
 State tvStopState = new TVStopState();

 context.setState(tvStartState);
 context.doAction();

 context.setState(tvStopState);
 context.doAction();

 }

}

上述程序的输出与没用使用任何设计模式的电视控制器的实现类似。

使用状态设计模式的优势就是实现多态性的过程是清晰可见的。状态的改变中产生的错误也较少,另外增加更多的状态以及行为变得容易且更具鲁棒性。此外状态模式也帮助避免if-else子句或者switch-case条件判定逻辑。

状态模式类似于策略模式,请看Java中的策略模式。这就是全部的状态设计模式,希望你喜欢上它了。

时间: 2024-09-19 08:53:45

Java中的状态模式实例教程的相关文章

Java中的策略模式实例教程

策略模式是一种行为模式.用于某一个具体的项目有多个可供选择的算法策略,客户端在其运行时根据不同需求决定使用某一具体算法策略. 策略模式也被称作政策模式.实现过程为,首先定义不同的算法策略,然后客户端把算法策略作为它的一个参数.使用这种模式最好的例子是Collection.sort()方法了,它使用Comparator对象作为参数.根据Comparator接口不同实现,对象会被不同的方法排序.详细介绍请看java中的排序对象. 本文例子是,完成一个简单地购物车,两种付款策略可供选择,一为信用卡,另

JAVA中的命令模式实例教程

命令模式是一种行为模式,因此,它处理的是对象的行为.命令模式为系统中不同的对象提供中性化的交流媒介.根据GoF的定义,命令模式是: 通过封装一组完全不相关的对象相互之间的的交互及通讯来完成松耦合. 允许某一个对象的行为的变化是独立于其他对象的. 在企业级应用中,命令模式是非常有用的,它使得多个对象可以相互交流.如果一些对象与另一些对象直接交流,系统组件之间是紧耦合的方式.这种方式导致系统具有更高的可维护性,可扩展的灵活性变得很低.命令模式专注于提供一个调解人介于需要交流的对象之间来帮助完成对象间

JAVA中的备忘录模式实例教程

备忘录模式是一种行为模式.备忘录模式用于保存对象当前状态,并且在之后可以再次使用此状态.备忘录模式实现的方式需要保证,被保存的对象状态不能被对象从外部访问,目的为了被保存的这些对象状态的完整性. 备忘录模式通过两个对象实现:Originator以及Caretaker.Originator类代表了其状态能够被存储并被用于恢复之前的状态,它使用内部类保存对象的状态.此内部类就被叫做备忘录,注意此类是私有的,它不能被其他对象访问. Caretaker是一个帮助类,它的职责就是通过备忘录帮助Origin

从工作流状态机实践中总结状态模式使用心得

 作者:banq 发表时间:2003年12月07日 00:10 回复 原贴网址:http://www.jdon.com/jivejdon/thread/10981.html   状态模式好像是很简单的模式,正因为状态好像是个简单的对象,想复杂化实现设计模式就不是容易,误用情况很多. 我个人曾经设计过一个大型游戏系统的游戏状态机,游戏状态可以说是游戏设计的主要架构,但是由于系统过分复杂和时间仓促,并没有真正实现状态模式. 目前在实现一个电子政务项目中,需要进行流程状态变化,在电子政务设计中,我发现

java中的工厂模式

举两个例子以快速明白Java中的工厂模式: 女娲抟土造人 话说:"天地开辟,未有人民,女娲抟土为人."女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的思想里面. 女娲造人,这就是简单工厂模式的应用. 首先,在这个造人的思想里面,有几个重要的角色:女娲本身.抽象的人的概念和女娲所造出的一个个具体的人. 1.)女娲是一个工厂类,也就是简单工厂模式的核心角色.         2.)具休的一个个的人,包括张三,李四等.这些人便是简单工厂模式里面的具体产品角色 3.)抽象

Java中实现文件拷实例

Java中实现文件拷实例 import java.io.*; class copy_file { public static void copyfile(String path1,String path2) throws IOException //使用FileInputStream和FileOutStream { FileInputStream fi=new FileInputStream(path1); FileOutputStream fo=new FileOutputStream(pat

实例讲解C++设计模式编程中State状态模式的运用场景_C 语言

State模式允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类. 在面向对象系统的开发和设计过程,经常会遇到一种情况就是需求变更(Requirement Changing),经常我们做好的一个设计.实现了一个系统原型,咱们的客户又会有了新的需求.我们又因此不得不去修改已有的设计,最常见就是解决方案就是给已经设计.实现好的类添加新的方法去实现客户新的需求,这样就陷入了设计变更的梦魇:不停地打补丁,其带来的后果就是设计根本就不可能封闭.编译永远都是整个系统代码. 访问者模式则提

详解PHP中的状态模式编程_php技巧

定义状态模式,又称状态对象模式(Pattern of Objects for State),状态模式就是对象的行为模式.状态模式允许一个对象在其内部状态改变的时候改变其行为.这个对象看上去就像是改变了它的类一样 UML图 状态模式中主要角色抽象状态角色(State):定义一个接口或抽象类State,用以封装环境对象的一个特定的状态所对应的行为 具体状态(ConcreteState)角色:每一个状态类都实现了环境(Context)的一个状态所对应的行为 环境(Context)角色:定义客户端所感兴

Android App中使用ListFragment的实例教程_Android

ListFragment继承于Fragment.因此它具有Fragment的特性,能够作为activity中的一部分,目的也是为了使页面设计更加灵活. 相比Fragment,ListFragment的内容是以列表(list)的形式显示的.ListFragment的布局默认包含一个ListView.因此,在ListFragment对应的布局文件中,必须指定一个 android:id 为 "@android:id/list" 的ListView控件! ListFragment基础使用下面介