Java设计模式之状态模式

简介:
状态模式定义 允许对象在自己内部状态改变时改变它的行为,对象看起来就像是修改了它的类。
该描述第一部分意思是,这个模式将状态封装进了一个独立的类,并将动作委托到对象的当前状态的状态对象。第二个部分意思就是,让客户感觉使用了对象能够改变它的行为,但是实际上这种设计模式  使用组合通过简单引用不同状态对象来造成类的改变假象。状态模式封装了一组行为。
状态模式类图
145022886.jpg
Context :是一个上下文类,可以拥有一些内部状态,并且将多个状态对象组合结合在一起。
State接口 :定义了所有状态具有的共同操作,一般可以将该接口的方法和context设置一样的。
ConcreteStateA :实现了具体的状态对象,处理来自context的请求,凡是context中调用request方法,都会将该方法委托到具体的状态对象来处理。
通过在context来利用组合和多态,从而在实际的状态改变中将行为委托到具体的实现状态类中,状态模式将每一个状态的行为具体到局部化到该状态所对象的类中,免去了大量的if判断,它可以让每一个状态“对修改关闭”,让context“对扩展开放”。
一般来说,当状态转换是固定的时候,一般将状态的改变放置到context中。当转换是动态的时候,则将状态的改变放置到状态类中,状态类中应该有context的引用。
实例代码
一个糖果机,有四种不同的状态,根据不同的行为就会转换成不同的状态。
状态State接口
package com.whut.state;

public interface State {
void insertQuarter();
void ejectQuarter();
void turnCrank();
void dispense();
}
糖果机类(context)
package com.whut.state;
//状态模式
public  class GumballMachine {

private State soleOutState;
private State noQuarterState;
private State hasQuarterState;
private State soldState;
private State winnerState;

private State state=soleOutState;
private  int count=0;

public GumballMachine( int count)
{
soleOutState= new SoldOutState( this);
noQuarterState= new NoQuarterState( this);
hasQuarterState= new HasQuarterState( this);
soldState= new SoldState( this);
winnerState= new WinnerState( this);
this.count=count;
if(count>0)
state=noQuarterState;
}
//投入25分的动作
public  void insertQuarter()
{
state.insertQuarter();
}

//退回25分的动作
public  void ejectQuarter()
{
state.ejectQuarter();
}

//转动曲柄
public  void turnCrank()
{
state.turnCrank();
state.dispense();
}

//释放糖果
public  void releaseBall()
{
System.out.println( "A gunmball comes rolling out the slot from machine");
if(count!=0)
count=count-1;
}

//打印机器当前状态
@Override
public String toString()
{
return "-----------"+ "\nThe machine state:"+state.toString()+ "\ncount="+count+ "\n-----------";
}

//设置状态
public void setState(State st)
{
this.state=st;
}

//获取状态
public State getSoleOutState() {
return soleOutState;
}
public State getNoQuarterState() {
return noQuarterState;
}
public State getHasQuarterState() {
return hasQuarterState;
}
public State getSoldState() {
return soldState;
}
//获取总的数目
public int getCount() {
return count;
}
public State getWinnerState() {
return winnerState;
}

}
状态实现类:
package com.whut.state;

public  class NoQuarterState  implements State {

private GumballMachine gumballMachine;
public NoQuarterState(GumballMachine gumballMachine)
{
this.gumballMachine=gumballMachine;
}

@Override
public void insertQuarter() {
System.out.println( "You inserted a quarter");
gumballMachine.setState(gumballMachine.getHasQuarterState());
}

@Override
public void ejectQuarter() {
System.out.println( "You haven't inserted a quarter");
}

@Override
public void turnCrank() {
System.out.println( "You turned,but there's no quarter");
}

@Override
public void dispense() {
System.out.println( "You need to pay a quarter first");
}
}
状态模式与策略模式比较
状态模式一群行为封装到状态对象中,Context的行为随时可委托到那些状态对象中的一个。对象的状态改变是在内部实现的,游走于对象集合中,用户察觉不到,只是通过触发相应的行为。状态模式利用许多个不同的状态对象作为其成员属性进行组合,任何状态的改变都是事先定义好的。
策略模式 客户往往是主动指定Context所要组合的策略对象是哪一个,使得能够在运行的时候改变策略即对象的行为。可以将状态模式想成是不用在context中放置许多条件判断语句的替代方法,通过将行为包装进状态对象后,可以通过在context内部来改变状态对象来改变context的行为。策略模式通常是利用行为或者策略类来配置context类的。


本文转自 zhao_xiao_long 51CTO博客,原文链接:http://blog.51cto.com/computerdragon/1177995

相关文章
|
5月前
|
设计模式 网络协议 数据可视化
Java 设计模式之状态模式:让对象的行为随状态优雅变化
状态模式通过封装对象的状态,使行为随状态变化而改变。以订单为例,将待支付、已支付等状态独立成类,消除冗长条件判断,提升代码可维护性与扩展性,适用于状态多、转换复杂的场景。
752 157
|
5月前
|
设计模式 Java Spring
Java 设计模式之责任链模式:优雅处理请求的艺术
责任链模式通过构建处理者链,使请求沿链传递直至被处理,实现发送者与接收者的解耦。适用于审批流程、日志处理等多级处理场景,提升系统灵活性与可扩展性。
612 2
|
7月前
|
设计模式 缓存 Java
Java设计模式(二):观察者模式与装饰器模式
本文深入讲解观察者模式与装饰器模式的核心概念及实现方式,涵盖从基础理论到实战应用的全面内容。观察者模式实现对象间松耦合通信,适用于事件通知机制;装饰器模式通过组合方式动态扩展对象功能,避免子类爆炸。文章通过Java示例展示两者在GUI、IO流、Web中间件等场景的应用,并提供常见陷阱与面试高频问题解析,助你写出灵活、可维护的代码。
|
5月前
|
设计模式 算法 搜索推荐
Java 设计模式之策略模式:灵活切换算法的艺术
策略模式通过封装不同算法并实现灵活切换,将算法与使用解耦。以支付为例,微信、支付宝等支付方式作为独立策略,购物车根据选择调用对应支付逻辑,提升代码可维护性与扩展性,避免冗长条件判断,符合开闭原则。
1042 35
|
10月前
|
设计模式 网络协议 Java
【设计模式】【行为型模式】状态模式(State)
一、入门 什么是状态模式? 状态模式(State Pattern)是一种行为设计模式,允许对象在其内部状态改变时改变其行为,使其看起来像是改变了类。状态模式的核心思想是将对象的状态封装成独立的类,并将
391 16
|
5月前
|
设计模式 消息中间件 传感器
Java 设计模式之观察者模式:构建松耦合的事件响应系统
观察者模式是Java中常用的行为型设计模式,用于构建松耦合的事件响应系统。当一个对象状态改变时,所有依赖它的观察者将自动收到通知并更新。该模式通过抽象耦合实现发布-订阅机制,广泛应用于GUI事件处理、消息通知、数据监控等场景,具有良好的可扩展性和维护性。
467 8
|
10月前
|
设计模式 缓存 安全
【高薪程序员必看】万字长文拆解Java并发编程!(8):设计模式-享元模式设计指南
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发编程中的经典对象复用设计模式-享元模式,废话不多说让我们直接开始。
213 0
|
7月前
|
设计模式 安全 Java
Java设计模式(一):单例模式与工厂模式
本文详解单例模式与工厂模式的核心实现及应用,涵盖饿汉式、懒汉式、双重检查锁、工厂方法、抽象工厂等设计模式,并结合数据库连接池与支付系统实战案例,助你掌握设计模式精髓,提升代码专业性与可维护性。
|
7月前
|
设计模式 XML 安全
Java枚举(Enum)与设计模式应用
Java枚举不仅是类型安全的常量,还具备面向对象能力,可添加属性与方法,实现接口。通过枚举能优雅实现单例、策略、状态等设计模式,具备线程安全、序列化安全等特性,是编写高效、安全代码的利器。
|
12月前
|
设计模式 Java 数据安全/隐私保护
Java 设计模式:装饰者模式(Decorator Pattern)
装饰者模式属于结构型设计模式,允许通过动态包装对象的方式为对象添加新功能,提供比继承更灵活的扩展方式。该模式通过组合替代继承,遵循开闭原则(对扩展开放,对修改关闭)。