`
wangkechao.dream
  • 浏览: 45871 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
352630cf-f670-3416-b946-55dec5cd787c
设计模式
浏览量:29980
社区版块
存档分类
最新评论

16.设计模式之状态模式

阅读更多

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();
	}

}

 

这就是状态模式



 

 

  • 大小: 34 KB
  • 大小: 21.1 KB
分享到:
评论

相关推荐

    【Java设计模式】《设计模式之禅》中的23种设计模式.zip

    【Java设计模式】《设计模式之禅》中的23种设计模式.zip 【Java设计模式】《设计模式之禅》中的23种设计模式.zip 【Java设计模式】《设计模式之禅》中的23种设计模式.zip 【Java设计模式】《设计模式之禅》中的23种...

    用PHP语言实现16个设计模式.zip

    以下是这16个设计模式的概述,以及它们在实际开发中的应用和重要性。 1. 单例模式:确保一个类只有一个实例,并提供全局访问点。在PHP中,常用于数据库连接或缓存管理,避免多次实例化导致的资源浪费。 2. 工厂...

    java 设计模式之状态模式

    状态模式是一种行为设计模式,它允许对象在内部状态改变时改变其行为,看起来好像对象改变了它的类。在Java中,状态模式通常通过定义不同的状态类和一个上下文类来实现,其中上下文类持有状态对象并调用其方法来响应...

    设计模式之状态模式

    这份文件讲诉了设计模式之状态模式,是以例子的形式进行讲诉的,希望可以帮助学习的人!

    Java设计模式之禅

    《Java设计模式之禅》是一本深入浅出讲解设计模式的书籍,书中不仅包含23种经典设计模式的案例,还详细介绍了设计模式背后的思想和原则,适合初学者以及对设计模式有一定了解的程序员阅读。本书旨在帮助读者理解如何...

    设计模式_源代码大全.zip

    设计模式_源代码大全.zip 包括:1.简单工厂模式 2.策略模式 3.装饰模式 4.代理模式 5.工厂方法模式 6.原型模式 7.模板方法模型 8.外观模式 9.建造者模式 10.观察者模式 11.抽象工厂模式 12.状态模式 13.适配器模式 ...

    Android编程设计模式之状态模式详解

    状态模式在Android编程中是一种非常重要的设计模式,它主要用于处理对象在不同状态下的不同行为。状态模式的核心思想是将每一种状态封装成一个类,使得对象可以在运行时根据其内部状态的变化来改变其行为。 一、...

    java.设计模式大作业 薪资交付系统

    8. **状态模式**:如果员工的薪资状态(如试用期、正式员工、离职等)影响其薪资计算,状态模式可以帮助简化代码,让每个状态对应一个类。 9. **命令模式**:薪资调整可能需要记录为操作命令,以便回滚或审计。命令...

    python实现23种设计模式.设计模式python语言版

    资源中包含的"23种设计模式.jpg"可能是设计模式的图表或总结,可以帮助理解和记忆各种模式。而"python爬虫js加密解密系列文章合集-云栖社区-阿里云.url"可能是一个链接,指向有关Python爬虫中使用设计模式解决JS加密...

    深入理解JavaScript系列.chm

    该文档是根据博客园汤姆大叔的深入理解JavaScript系列...43.设计模式之状态模式 44.设计模式之桥接模式 45.代码复用模式(避免篇) 46.代码复用模式(推荐篇) 47.对象创建模式(上篇) 48.对象创建模式(下篇)

    java设计模式之-状态模式-实现

    状态模式是一种行为设计模式,它允许对象在内部状态改变时改变其行为,对象看起来似乎修改了它的类。这种模式常用于处理对象的状态变化,并且在不同的状态下,对象的行为也相应地变化。在Java中,我们可以利用接口、...

    Java 23种设计模式24状态模式.pdf

    在《Java 23种设计模式24状态模式.pdf》中,作者通过详细的讲解和实例,深入探讨了状态模式的概念、动机、结构、分析及应用。 ### 模式动机 状态模式的核心动机在于解决对象状态变化导致的行为变化问题。当一个...

    设计模式之状态模式(State)

    状态模式是一种行为设计模式,它使对象能够在内部状态改变时改变其行为,看起来好像改变了它的类。这种模式常用于处理对象在不同状态下表现各异的情况,避免了复杂的条件语句,提高了代码的可读性和可维护性。 在...

    JavaScript设计模式.pdf

    单体模式是JavaScript中最基本的设计模式之一。它的主要作用是提供一个命名空间,减少全局变量的数量,避免代码冲突,并组织代码使其易于维护。单体模式可以用来划分命名空间,组织代码和避免代码冲突。 2. 工厂...

    C#23种设计模式【完整】.pdf

    21. 状态模式(State Pattern):允许一个对象在其内部状态改变时改变其行为,使对象看起来似乎修改了其类。 通过学习和掌握这些设计模式,可以提高程序员的设计和编码能力,提高软件系统的灵活性、可维护性和可...

    C#设计模式_设计模式_C#_

    创建型: 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3. 建造者模式(Builder) 4. 工厂方法模式(Factory Method) 5. 原型模式(Prototype)结构型: 6.... 状态模式(State Pattern)

    java设计模式之状态模式

    状态模式是一种行为设计模式,它允许对象在内部状态改变时改变其行为,对象看起来似乎修改了它的类。这种模式常用于处理对象的状态变化,使得代码更易于理解和维护。在Java中,状态模式通常通过实现接口或者继承抽象...

    设计模式的状态模式的例子

    状态模式是一种行为设计模式,它允许对象在其内部状态改变时改变其行为,使得对象看起来好像修改了它的类。这种模式通常用于当一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变来改变其行为时。在这个...

    设计模式之状态模式Java版本实现

    状态模式是一种行为设计模式,它允许对象在内部状态改变时改变其行为,对象看起来似乎修改了它的类。这种模式常用于处理对象的状态变化,并且根据不同的状态,对象的行为也相应地变化。 在Java中实现状态模式,我们...

Global site tag (gtag.js) - Google Analytics