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

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 设计模式之状态模式

    java设计模式之状态模式入门

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

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

    设计模式之状态模式

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

    深入理解JavaScript系列.chm

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

    深入浅出java设计模式(高清中文PDF)

    文件类型为PDF文件,此文档对20多种java设计模式进行了详细讲解,在中文讲解的过程中还附有代码示例给学习者进行参考,使学习者通过实践更容易理解设计模式的原理。 本文档目录: 1.工厂模式 2.单例模式 3.建造...

    设计模式之状态模式实例

    设计模式之状态模式实例,用Java实现,副讲解 设计模式之状态模式实例,用Java实现,副讲解 设计模式之状态模式实例,用Java实现,副讲解

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

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

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

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

    java 23种设计模式.zip

    设计模式主要分为三大类: 1.创建型模式:工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式。 2.结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。 4.行为型模式:...

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

    设计模式之状态模式的Java版本实现和UML类图设计

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

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

    java设计模式之状态模式

    java设计模式之状态模式,通过实际生活中的例子说明状态模式的原理。

    状态模式.rar之java设计模式

    状态模式.rar状态模式.rar之java设计模式

    32种设计模式

    C# 32种设计模式: 创建型: 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3. 建造者模式(Builder) 4. 工厂方法模式(Factory Method) 5. 原型模式(Prototype) ...

    设计模式C++学习之状态模式(State)

    设计模式C++学习之状态模式(State)

    06.设计模式.rar

    总体来说设计模式分为三大类:创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式...

    55-Java设计模式之策略模式与状态模式1

    55-Java设计模式之策略模式与状态模式1

    java中的设计模式,主要的设计模式

    设计模式:(常用23种-----像内功心法) 1. 设计模式不是一个知识点 2. 设计模式是一种设计经验的总结 3. 设计模式是用来解决某些场景下的某一类问题-------... 命令模式、状态模式、备忘录模式、访问者模式、中介者模式

    设计模式:状态模式TCPConnection案例

    设计模式:状态模式TCPConnection案例,详细介绍可参考我的csdn博客。

    基于Java的设计模式大作业绘图系统【六种设计模式+文档】.zip

    本系统基于六种设计模式,运用到的设计模式有备忘录模式,简单工厂模式,迭代器模式,状态模式,模版方法模式,单例模式。 具体实现过程、UML类图以及实现效果详见如下项目说明地址: ... 该系统为绘图系统,该系统通过...

Global site tag (gtag.js) - Google Analytics