- 浏览: 41111 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-
xieyaxiong:
songbin0201 写道整篇文章的精华在那些gif图片上 ...
排序算法 -
songbin0201:
整篇文章的精华在那些gif图片上
排序算法
针对问题:有时候一个方法可能有很多if..else来判断状态后再执行相关操作,当很多方法都重复的出现这样的if..else判断时,就可以考虑用状态模式了。
状态模式的结构图和策略模式一样,事实上状态模式和策略很相似,不同的是状态模式除了委托状态外,状态实体自身持有主实体对象的引用,在状态实体内部可以动态的改变主实体的状态。
状态模式结构图:
状态模式实现代码:
/** * 状态接口 * @author bruce * */ public interface State { public void insertQuarter(); public void ejectQuarter(); public void turnCrank(); public void dispense(); } /** * 有钱状态 * @author bruce * */ public class HasQuarterState implements State{ GumballMachine gumballMachine; public HasQuarterState(GumballMachine gumballMachine){ this.gumballMachine=gumballMachine; } public void dispense() { // TODO Auto-generated method stub System.out.println("No gumball dispensed"); } public void ejectQuarter() { // TODO Auto-generated method stub System.out.println("Quarter returned"); gumballMachine.setState(gumballMachine.getNoQuarterState()); } public void insertQuarter() { // TODO Auto-generated method stub System.out.println("You can't insert another quarter"); } public void turnCrank() { // TODO Auto-generated method stub System.out.println("You returned..."); gumballMachine.setState(gumballMachine.getSoldState()); } } /** * 没钱状态 * @author bruce * */ public class NoQuarterState implements State{ private GumballMachine gumballMachine; public NoQuarterState(GumballMachine gumballMachine){ this.gumballMachine=gumballMachine; } public void dispense() { // TODO Auto-generated method stub System.out.println("You need to pay first"); } public void ejectQuarter() { // TODO Auto-generated method stub System.out.println("You haven't inserted a quarter"); } public void insertQuarter() { // TODO Auto-generated method stub System.out.println("You inserted a quarter"); gumballMachine.setState(gumballMachine.getHasQuarterState()); } public void turnCrank() { // TODO Auto-generated method stub System.out.println("You turned,but there's no quarter"); } } /** * 售出状态 * @author bruce * */ public class SoldState implements State{ private GumballMachine gumballMachine; public SoldState(GumballMachine gumballMachine){ this.gumballMachine=gumballMachine; } public void dispense() { // TODO Auto-generated method stub gumballMachine.releaseBall(); if(gumballMachine.getCount()>0){ gumballMachine.setState(gumballMachine.getNoQuarterState()); }else{ System.out.println("Oops,out of gumballs!"); gumballMachine.setState(gumballMachine.getSoldOutState()); } } public void ejectQuarter() { // TODO Auto-generated method stub System.out.println("Sorry, you already turned the crank"); } public void insertQuarter() { // TODO Auto-generated method stub System.out.println("Please wait, we're already giving you a gumball"); } public void turnCrank() { // TODO Auto-generated method stub System.out.println("Turning twice doesn't get you another gumball!"); } } /** * 卖完状态 * @author bruce * */ public class SoldOutState implements State{ @SuppressWarnings("unused") private GumballMachine gumballMachine; public SoldOutState(GumballMachine gumballMachine){ this.gumballMachine=gumballMachine; } public void dispense() { // TODO Auto-generated method stub System.out.println("No gumball dispensed"); } public void ejectQuarter() { // TODO Auto-generated method stub System.out.println("You can't eject, you haven't inserted a quarter yet"); } public void insertQuarter() { // TODO Auto-generated method stub System.out.println("You can't insert a quarter,the machine is sold out"); } public void turnCrank() { // TODO Auto-generated method stub System.out.println("You turned, but there are no gumballs"); } } /** * 糖果机 * @author bruce * */ public class GumballMachine { State soldOutState; State noQuarterState; State hasQuarterState; State soldState; State state=soldOutState; int count=0; public GumballMachine(int numberGumballs){ soldOutState=new SoldOutState(this); noQuarterState=new NoQuarterState(this); hasQuarterState=new HasQuarterState(this); soldState=new SoldState(this); this.count=numberGumballs; if(numberGumballs>0){ state=noQuarterState; } } public void insertQuarter(){ state.insertQuarter(); } public void ejectQuarter(){ state.ejectQuarter(); } public void turnCrank(){ state.turnCrank(); state.dispense(); } void setState(State state){ this.state=state; } void releaseBall(){ System.out.println("A gumball comes rolling out the slot..."); if(count !=0){ count=count-1; } } public State getSoldOutState() { return soldOutState; } public State getNoQuarterState() { return noQuarterState; } public State getHasQuarterState() { return hasQuarterState; } public State getSoldState() { return soldState; } public State getState() { return state; } public int getCount() { return count; } } /** * 测试 * @author bruce * */ public class Client { public static void main(String[] args) { GumballMachine gumballMachine=new GumballMachine(5); System.out.println("-------------"); gumballMachine.insertQuarter(); gumballMachine.turnCrank(); System.out.println("-------------"); gumballMachine.insertQuarter(); gumballMachine.turnCrank(); gumballMachine.insertQuarter(); gumballMachine.turnCrank(); System.out.println("-------------"); /** * output: * ------------- You inserted a quarter You returned... A gumball comes rolling out the slot... ------------- You inserted a quarter You returned... A gumball comes rolling out the slot... You inserted a quarter You returned... A gumball comes rolling out the slot... ------------- */ } }
发表评论
-
design pattern——代理模式
2012-07-25 17:57 648针对问题: 在某些情况下,一个客户不想或者不能直接引用另一个 ... -
design pattern——组合模式
2012-07-24 11:16 616针对问题:组合模式使我们在处理树型结构的问题中,模糊了简单元素 ... -
design pattern——迭代器模式
2012-07-23 17:50 656针对问题:提供统一接口访问集合,屏蔽集合内部数据的访问和数据结 ... -
design pattern——模板方法模式
2012-07-23 16:25 715针对问题:许多类可能做着大同小异的事情,很多方法都有重复,可以 ... -
design pattern——外观模式
2012-07-20 15:11 615针对问题:在软件开发系统中,客户程序经常会与复杂系统的内部子系 ... -
design pattern——适配器模式
2012-07-20 14:30 699针对问题:将一个类的接口转换成客户希望的另外一个接口。A ... -
design pattern——命令模式
2012-07-19 17:03 782针对问题:在软件系统中,“行为请求者”与“行为实现 ... -
design pattern——单例模式
2012-07-13 17:34 673单例是乎没什么好说的,创建的过程中需要考虑到的是并发安全问题和 ... -
design pattern——抽象工厂模式
2012-07-13 17:31 692针对问题:和工厂方法模式类似,用一个继承体系来实现创建对象的 ... -
design pattern——工厂方法模式
2012-07-13 17:25 666针对问题:当要创建的产品种类很多,并且会随着时间的推移会不断 ... -
design pattern——装饰者模式
2012-07-12 13:40 713针对问题:在两个集合中的对象期望做到任意组合,而这样的组合的可 ... -
design pattern——观察者模式
2012-07-11 17:59 663针对问题:在消息-通知 的程序结构中,为了通知待通知的 ... -
design pattern——策略模式
2012-07-10 15:16 661针对问题:在许多继承体系结构中,经常出现的一些问题是在超 ... -
抽象类还是接口?
2012-07-10 11:29 666从概念上看 抽象类要描述的是一种类型,和普通的实 ...
相关推荐
十一个行为型模式 状态模式-State Pattern 处理对象的多种状态及其相互转换——状态模式(一) 处理对象的多种状态及其相互转换——状态模式(二) 处理对象的多种状态及其相互转换——状态模式(三) 处理对象的...
9. **状态模式(State)**:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类,但实际上只是改变了状态。 10. **访问者模式(Visitor)**:表示一个作用于某对象结构中的各元素的操作。它...
20. **状态模式**:允许对象在其内部状态改变时改变它的行为,对象看起来似乎改变了它的类。 21. **策略模式**:定义了一系列的算法,并将每一个算法封装起来,使它们可以互相替换。策略对象改变算法的行为。 22. ...
- 状态模式:允许一个对象在其内部状态改变时改变它的行为,看起来像是改变了它的类。 - 策略模式:定义一系列算法,并将每个算法封装起来,使它们可以相互替换。 - 模板方法模式:定义一个操作中的算法骨架,而...
为了帮助 .NET 开发者更好地理解和应用这些设计模式,《Head First 设计模式》为 .NET 2.0 特别推出了一个配套文档——《设计模式框架》(Design Pattern FrameworkTM),该文档涵盖了原书中介绍的所有设计模式,并...
通过阅读GOF23种设计模式.docx文档和探索DesignPattern项目中的代码,你可以深入理解每种模式的用途、优点以及如何在C#和.NET Core环境中实现它们。对于想要提升编程技能和代码质量的开发者来说,这是一个宝贵的资源...
在"Observer HeadFirst design pattern"中,作者通过生动的比喻和互动式的例子,帮助读者深入理解观察者模式的核心概念和实现方式。 观察者模式的核心思想是将"主题"(Subject)与"观察者"(Observer)解耦,主题...
这类模式主要关注对象间的交互和责任分配,如策略模式(Strategy)、模板方法模式(Template Method)、观察者模式(Observer)、迭代器模式(Iterator)、命令模式(Command)、备忘录模式(Memento)、状态模式...
- 状态模式:允许对象在其内部状态改变时改变其行为,看起来像改变了其类。 - 策略模式:定义一系列的算法,并将每一个算法封装起来,使它们可以互相替换。 - 模板方法模式:定义一个操作中的算法骨架,而将一些...
虽然对于初学者来说,面对英文资料可能会感到困难,但“Design Pattern In C# (英文).pdf”这本书为读者提供了23种经典设计模式的详细解释,包括了它们的概念、实现方式以及在C#中的应用实例。尽管阅读时可能会遇到...
- 状态模式(State):允许对象在内部状态改变时改变它的行为,对象看起来似乎修改了它的类。 - 策略模式(Strategy):定义一组相关或相互排斥的算法,并将每个算法封装起来,使它们可以互相替换。 - 模板方法...
**设计模式**(Design Patterns)是软件工程中的一个重要概念,它是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。本章节将从多个角度对设计模式进行深入探讨。 #### 二、设计模式的基本定义 ...
#### 第10章:状态变迁——状态模式 状态模式允许对象在其内部状态发生变化时改变它的行为。当对象的状态变化时,其对应的行为也会随之变化。这一模式非常适合于处理复杂的流程控制逻辑,通过将不同的状态定义为...
### 设计模式精解——GoF 23种设计模式解析及C++实现源码 #### 引言 设计模式是软件工程领域中一个极为重要的概念,它代表着一系列被广泛接受的解决特定问题的方法。GoF(Gang of Four)所提出的23种设计模式更是...