`
xieyaxiong
  • 浏览: 41111 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

design pattern——状态模式

 
阅读更多

 

针对问题:有时候一个方法可能有很多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...
			-------------
		 */
	}
}
 
  • 大小: 4.3 KB
分享到:
评论

相关推荐

    design-pattern-java.pdf

    十一个行为型模式 状态模式-State Pattern 处理对象的多种状态及其相互转换——状态模式(一) 处理对象的多种状态及其相互转换——状态模式(二) 处理对象的多种状态及其相互转换——状态模式(三) 处理对象的...

    Head First Design Pattern

    9. **状态模式(State)**:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类,但实际上只是改变了状态。 10. **访问者模式(Visitor)**:表示一个作用于某对象结构中的各元素的操作。它...

    GoF的经典著作设计模式(Design Pattern)

    20. **状态模式**:允许对象在其内部状态改变时改变它的行为,对象看起来似乎改变了它的类。 21. **策略模式**:定义了一系列的算法,并将每一个算法封装起来,使它们可以互相替换。策略对象改变算法的行为。 22. ...

    模式举例代码——设计模式和举例代码

    - 状态模式:允许一个对象在其内部状态改变时改变它的行为,看起来像是改变了它的类。 - 策略模式:定义一系列算法,并将每个算法封装起来,使它们可以相互替换。 - 模板方法模式:定义一个操作中的算法骨架,而...

    Design Pattern FrameworkTM

    为了帮助 .NET 开发者更好地理解和应用这些设计模式,《Head First 设计模式》为 .NET 2.0 特别推出了一个配套文档——《设计模式框架》(Design Pattern FrameworkTM),该文档涵盖了原书中介绍的所有设计模式,并...

    GOF之23种设计模式的C#实现:DesignPattern.zip

    通过阅读GOF23种设计模式.docx文档和探索DesignPattern项目中的代码,你可以深入理解每种模式的用途、优点以及如何在C#和.NET Core环境中实现它们。对于想要提升编程技能和代码质量的开发者来说,这是一个宝贵的资源...

    Observer HeadFirst design pattern

    在"Observer HeadFirst design pattern"中,作者通过生动的比喻和互动式的例子,帮助读者深入理解观察者模式的核心概念和实现方式。 观察者模式的核心思想是将"主题"(Subject)与"观察者"(Observer)解耦,主题...

    HeadFirst Design Pattern

    这类模式主要关注对象间的交互和责任分配,如策略模式(Strategy)、模板方法模式(Template Method)、观察者模式(Observer)、迭代器模式(Iterator)、命令模式(Command)、备忘录模式(Memento)、状态模式...

    design-pattern(设计模式,包括创建型、结构型、行为型三大类共23种常见的设计模式和J2EE常见设计模式等).zip

    - 状态模式:允许对象在其内部状态改变时改变其行为,看起来像改变了其类。 - 策略模式:定义一系列的算法,并将每一个算法封装起来,使它们可以互相替换。 - 模板方法模式:定义一个操作中的算法骨架,而将一些...

    Introduction to Design Pattern in C#

    虽然对于初学者来说,面对英文资料可能会感到困难,但“Design Pattern In C# (英文).pdf”这本书为读者提供了23种经典设计模式的详细解释,包括了它们的概念、实现方式以及在C#中的应用实例。尽管阅读时可能会遇到...

    Design Pattern

    - 状态模式(State):允许对象在内部状态改变时改变它的行为,对象看起来似乎修改了它的类。 - 策略模式(Strategy):定义一组相关或相互排斥的算法,并将每个算法封装起来,使它们可以互相替换。 - 模板方法...

    GOF-设计模式-Design Patterns-英文原版-高清-有目录-有页码

    **设计模式**(Design Patterns)是软件工程中的一个重要概念,它是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。本章节将从多个角度对设计模式进行深入探讨。 #### 二、设计模式的基本定义 ...

    设计模式 Head First

    #### 第10章:状态变迁——状态模式 状态模式允许对象在其内部状态发生变化时改变它的行为。当对象的状态变化时,其对应的行为也会随之变化。这一模式非常适合于处理复杂的流程控制逻辑,通过将不同的状态定义为...

    设计模式C++版(pdf版)

    ### 设计模式精解——GoF 23种设计模式解析及C++实现源码 #### 引言 设计模式是软件工程领域中一个极为重要的概念,它代表着一系列被广泛接受的解决特定问题的方法。GoF(Gang of Four)所提出的23种设计模式更是...

Global site tag (gtag.js) - Google Analytics