1. 定义:
状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为模式。
状态模式允许一个对象在其内部状态改变的时候改变其行为。这个对象看上去就像是改变了它的类一样
2.例子:
例子参考HeadFirst 通过状态模式实现糖果机,糖果机分为四个状态:投币,未投币,售完,销售中
然后通过当前状态决定当前的操作,看一下,未用状态模式实现的java代码
public class GumballMachine { //糖果机有四种状态,分别为:投币 、未投币 、售磬、销售中 private static int has_money=0; private static int no_money=1; private static int no_goods=3; private static int solding=4; int state=solding; int count=0; public GumballMachine(int count) { this.count=count; if(count >0){ state = no_money; } } //四种操作 //投币 //退钱 //转动曲柄 public void insertMoney(){ if(state == has_money){ System.out.println("已经投过币了"); }else if(state == no_money){ state=has_money; System.out.println("投入了硬币"); }else if(state == no_goods){ System.out.println("不能投币,因为没有商口了"); }else if(state == solding){ System.out.println("稍等一下"); } } public void ejectMoney(){ if(state == has_money){ System.out.println("退币了"); state = no_money; }else if(state == no_money){ System.out.println("没投币,退不了"); }else if(state == solding){ System.out.println("刚退了"); }else if(state == no_goods){ System.out.println("就不给你退"); } } public void turnHandler(){ if(state == solding){ System.out.println("骗子"); }else if(state == no_money){ System.out.println("先投币"); }else if(state == no_goods){ System.out.println("没有商口"); }else if(state == has_money){ System.out.println("给你"); state=solding; dispense(); } } public void dispense(){ if(state == solding){ System.out.println("稍等"); count--; if(count == 0){ System.out.println("卖完了"); state = no_goods; }else{ state = no_money; } }else if(state == no_money){ System.out.println("先投币"); }else if(state == no_goods){ System.out.println("没有商口"); }else if(state == has_money){ System.out.println("给你"); state=solding; dispense(); } } }
如果只是这四种状态,这个是没有问题,但是再添加一种状态的时候,会发现每一个方法都要改,会造成 代码特别不容易维护。这个时候就用到了状态模式,把状态抽象成一个接口,然后,针对每一种状态有一个实现类。
看一下类图结构:
通过类图,我们重写上面的代码。
首先是一个State接口:
/** * 状态接口 * @author king * */ public interface State { public void insertMoney(); public void ejectMoney(); public void turnHandler(); public void dispense(); }
2. 没有投币的实现类
public class NoMoneyState implements State{ GumballMachine machine; public NoMoneyState(GumballMachine machine) { this.machine = machine; } @Override public void insertMoney() { System.out.println("投入了一个硬币"); machine.setDefaultState(machine.getHasMoneyState()); } @Override public void ejectMoney() { System.out.println("没有投币"); } @Override public void turnHandler() { System.out.println("没有钱,不能转"); } @Override public void dispense() { System.out.println("投币"); } }
3.销售状态的实现类
public class SoldingState implements State{ GumballMachine machine; public SoldingState(GumballMachine machine) { this.machine = machine; } @Override public void insertMoney() { System.out.println("等会再投"); } @Override public void ejectMoney() { System.out.println("退不了了"); } @Override public void turnHandler() { System.out.println("转动没用的"); } @Override public void dispense() { machine.releaseBall(); if(machine.getCount()>0){ machine.setDefaultState(machine.getNoMoneyState()); }else{ machine.setDefaultState(machine.getNoGoodsState()); } } }
4. 我们看一下销售机做了哪些便化
public class GumballMachine { private State noMoneyState; private State hasMoneyState; private State soldingState; private State noGoodsState; State defaultState = soldingState; int count=0; public State getNoMoneyState() { return noMoneyState; } public void setNoMoneyState(State noMoneyState) { this.noMoneyState = noMoneyState; } public State getHasMoneyState() { return hasMoneyState; } public void setHasMoneyState(State hasMoneyState) { this.hasMoneyState = hasMoneyState; } public State getSoldingState() { return soldingState; } public void setSoldingState(State soldingState) { this.soldingState = soldingState; } public State getNoGoodsState() { return noGoodsState; } public void setNoGoodsState(State noGoodsState) { this.noGoodsState = noGoodsState; } public State getDefaultState() { return defaultState; } public void setDefaultState(State defaultState) { this.defaultState = defaultState; } public GumballMachine(int count) { noMoneyState = new NoMoneyState(this); noGoodsState = new NoGoodsState(this); hasMoneyState = new HasMoneyState(this); soldingState = new SoldingState(this); this.count = count; if(this.count>0){ defaultState = noMoneyState; } } void releaseBall(){ System.out.println("出糖"); if(count!=0){ count--; } } public int getCount() { return count; } public void setCount(int count) { this.count = count; } public void insertMoney(){ defaultState.insertMoney(); } public void ejectMoney(){ defaultState.ejectMoney(); } public void turnHandler(){ defaultState.turnHandler(); defaultState.dispense(); } }
这就是状态模式
相关推荐
【Java设计模式】《设计模式之禅》中的23种设计模式.zip 【Java设计模式】《设计模式之禅》中的23种设计模式.zip 【Java设计模式】《设计模式之禅》中的23种设计模式.zip 【Java设计模式】《设计模式之禅》中的23种...
以下是这16个设计模式的概述,以及它们在实际开发中的应用和重要性。 1. 单例模式:确保一个类只有一个实例,并提供全局访问点。在PHP中,常用于数据库连接或缓存管理,避免多次实例化导致的资源浪费。 2. 工厂...
状态模式是一种行为设计模式,它允许对象在内部状态改变时改变其行为,看起来好像对象改变了它的类。在Java中,状态模式通常通过定义不同的状态类和一个上下文类来实现,其中上下文类持有状态对象并调用其方法来响应...
这份文件讲诉了设计模式之状态模式,是以例子的形式进行讲诉的,希望可以帮助学习的人!
《Java设计模式之禅》是一本深入浅出讲解设计模式的书籍,书中不仅包含23种经典设计模式的案例,还详细介绍了设计模式背后的思想和原则,适合初学者以及对设计模式有一定了解的程序员阅读。本书旨在帮助读者理解如何...
设计模式_源代码大全.zip 包括:1.简单工厂模式 2.策略模式 3.装饰模式 4.代理模式 5.工厂方法模式 6.原型模式 7.模板方法模型 8.外观模式 9.建造者模式 10.观察者模式 11.抽象工厂模式 12.状态模式 13.适配器模式 ...
状态模式在Android编程中是一种非常重要的设计模式,它主要用于处理对象在不同状态下的不同行为。状态模式的核心思想是将每一种状态封装成一个类,使得对象可以在运行时根据其内部状态的变化来改变其行为。 一、...
8. **状态模式**:如果员工的薪资状态(如试用期、正式员工、离职等)影响其薪资计算,状态模式可以帮助简化代码,让每个状态对应一个类。 9. **命令模式**:薪资调整可能需要记录为操作命令,以便回滚或审计。命令...
资源中包含的"23种设计模式.jpg"可能是设计模式的图表或总结,可以帮助理解和记忆各种模式。而"python爬虫js加密解密系列文章合集-云栖社区-阿里云.url"可能是一个链接,指向有关Python爬虫中使用设计模式解决JS加密...
该文档是根据博客园汤姆大叔的深入理解JavaScript系列...43.设计模式之状态模式 44.设计模式之桥接模式 45.代码复用模式(避免篇) 46.代码复用模式(推荐篇) 47.对象创建模式(上篇) 48.对象创建模式(下篇)
状态模式是一种行为设计模式,它允许对象在内部状态改变时改变其行为,对象看起来似乎修改了它的类。这种模式常用于处理对象的状态变化,并且在不同的状态下,对象的行为也相应地变化。在Java中,我们可以利用接口、...
在《Java 23种设计模式24状态模式.pdf》中,作者通过详细的讲解和实例,深入探讨了状态模式的概念、动机、结构、分析及应用。 ### 模式动机 状态模式的核心动机在于解决对象状态变化导致的行为变化问题。当一个...
状态模式是一种行为设计模式,它使对象能够在内部状态改变时改变其行为,看起来好像改变了它的类。这种模式常用于处理对象在不同状态下表现各异的情况,避免了复杂的条件语句,提高了代码的可读性和可维护性。 在...
单体模式是JavaScript中最基本的设计模式之一。它的主要作用是提供一个命名空间,减少全局变量的数量,避免代码冲突,并组织代码使其易于维护。单体模式可以用来划分命名空间,组织代码和避免代码冲突。 2. 工厂...
21. 状态模式(State Pattern):允许一个对象在其内部状态改变时改变其行为,使对象看起来似乎修改了其类。 通过学习和掌握这些设计模式,可以提高程序员的设计和编码能力,提高软件系统的灵活性、可维护性和可...
创建型: 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3. 建造者模式(Builder) 4. 工厂方法模式(Factory Method) 5. 原型模式(Prototype)结构型: 6.... 状态模式(State Pattern)
状态模式是一种行为设计模式,它允许对象在内部状态改变时改变其行为,对象看起来似乎修改了它的类。这种模式常用于处理对象的状态变化,使得代码更易于理解和维护。在Java中,状态模式通常通过实现接口或者继承抽象...
状态模式是一种行为设计模式,它允许对象在其内部状态改变时改变其行为,使得对象看起来好像修改了它的类。这种模式通常用于当一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变来改变其行为时。在这个...
状态模式是一种行为设计模式,它允许对象在内部状态改变时改变其行为,对象看起来似乎修改了它的类。这种模式常用于处理对象的状态变化,并且根据不同的状态,对象的行为也相应地变化。 在Java中实现状态模式,我们...