zoukankan      html  css  js  c++  java
  • 设计模式——状态模式

    描述:

    允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。

    主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同的一系列类当中,可以把复杂的逻辑判断简单化。

    通常应用在有好多状态的流程中。

    类图:

    以下程序模拟糖果机器投币取糖果的状态流程。

    1.定义状态结构

    package net.dp.state.gumballstate;
    
    public interface State {
    
    	public void insertQuarter();
    
    	public void ejectQuarter();
    
    	public void turnCrank();
    
    	public void dispense();
    }
    

      

    2.没有投币状态类

    package net.dp.state.gumballstate;
    
    public class NoQuarterState implements State {
    	GumballMachine gumballMachine;
    
    	public NoQuarterState(GumballMachine gumballMachine) {
    		this.gumballMachine = gumballMachine;
    	}
    
    	public void insertQuarter() {
    		System.out.println("You inserted a quarter");
    		gumballMachine.setState(gumballMachine.getHasQuarterState());
    	}
    
    	public void ejectQuarter() {
    		System.out.println("You haven't inserted a quarter");
    	}
    
    	public void turnCrank() {
    		System.out.println("You turned, but there's no quarter");
    	}
    
    	public void dispense() {
    		System.out.println("You need to pay first");
    	}
    
    	public String toString() {
    		return "waiting for quarter";
    	}
    }
    

      

    3.已经投币状态

    package net.dp.state.gumballstate;
    
    public class HasQuarterState implements State {
    	GumballMachine gumballMachine;
    
    	public HasQuarterState(GumballMachine gumballMachine) {
    		this.gumballMachine = gumballMachine;
    	}
    
    	public void insertQuarter() {
    		System.out.println("You can't insert another quarter");
    	}
    
    	public void ejectQuarter() {
    		System.out.println("Quarter returned");
    		gumballMachine.setState(gumballMachine.getNoQuarterState());
    	}
    
    	public void turnCrank() {
    		System.out.println("You turned...");
    		gumballMachine.setState(gumballMachine.getSoldState());
    	}
    
    	public void dispense() {
    		System.out.println("No gumball dispensed");
    	}
    
    	public String toString() {
    		return "waiting for turn of crank";
    	}
    }
    

      

    4.售罄状态

    package net.dp.state.gumballstate;
    
    public class SoldOutState implements State {
    	GumballMachine gumballMachine;
    
    	public SoldOutState(GumballMachine gumballMachine) {
    		this.gumballMachine = gumballMachine;
    	}
    
    	public void insertQuarter() {
    		System.out
    				.println("You can't insert a quarter, the machine is sold out");
    	}
    
    	public void ejectQuarter() {
    		System.out
    				.println("You can't eject, you haven't inserted a quarter yet");
    	}
    
    	public void turnCrank() {
    		System.out.println("You turned, but there are no gumballs");
    	}
    
    	public void dispense() {
    		System.out.println("No gumball dispensed");
    	}
    
    	public String toString() {
    		return "sold out";
    	}
    }
    

      

    5.销售

    package net.dp.state.gumballstate;
    
    public class SoldState implements State {
    
    	GumballMachine gumballMachine;
    
    	public SoldState(GumballMachine gumballMachine) {
    		this.gumballMachine = gumballMachine;
    	}
    
    	public void insertQuarter() {
    		System.out.println("Please wait, we're already giving you a gumball");
    	}
    
    	public void ejectQuarter() {
    		System.out.println("Sorry, you already turned the crank");
    	}
    
    	public void turnCrank() {
    		System.out.println("Turning twice doesn't get you another gumball!");
    	}
    
    	public void dispense() {
    		gumballMachine.releaseBall();
    		if (gumballMachine.getCount() > 0) {
    			gumballMachine.setState(gumballMachine.getNoQuarterState());
    		} else {
    			System.out.println("Oops, out of gumballs!");
    			gumballMachine.setState(gumballMachine.getSoldOutState());
    		}
    	}
    
    	public String toString() {
    		return "dispensing a gumball";
    	}
    }
    

      

    6.聚合类

    package net.dp.state.gumballstate;
    
    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;
    		}
    	}
    
    	int getCount() {
    		return count;
    	}
    
    	void refill(int count) {
    		this.count = count;
    		state = noQuarterState;
    	}
    
    	public State getState() {
    		return state;
    	}
    
    	public State getSoldOutState() {
    		return soldOutState;
    	}
    
    	public State getNoQuarterState() {
    		return noQuarterState;
    	}
    
    	public State getHasQuarterState() {
    		return hasQuarterState;
    	}
    
    	public State getSoldState() {
    		return soldState;
    	}
    
    	public String toString() {
    		StringBuffer result = new StringBuffer();
    		result.append("
    Mighty Gumball, Inc.");
    		result.append("
    Java-enabled Standing Gumball Model #2004");
    		result.append("
    Inventory: " + count + " gumball");
    		if (count != 1) {
    			result.append("s");
    		}
    		result.append("
    ");
    		result.append("Machine is " + state + "
    ");
    		return result.toString();
    	}
    }
    

      

    7.测试

    package net.dp.state.gumballstate;
    
    
    public class GumballMachineTestDrive {
    
    	public static void main(String[] args) {
    		GumballMachine gumballMachine = new GumballMachine(5);
    
    		System.out.println(gumballMachine);
    
    		gumballMachine.insertQuarter();
    		gumballMachine.turnCrank();
    
    		System.out.println(gumballMachine);
    
    		gumballMachine.insertQuarter();
    		gumballMachine.turnCrank();
    		gumballMachine.insertQuarter();
    		gumballMachine.turnCrank();
    
    		System.out.println(gumballMachine);
    	}
    }
    

      

  • 相关阅读:
    地址null发布新的JS游戏《吞食蛇永恒激情版》
    iteratornullHDU4302(map的用法)
    对象类亮剑.NET的系列文章之.NET详解(开端)
    视频连接【视频】Arduino 以太网插板介绍
    选中条目android spinner的使用
    进口问题限制进口肯定解决不了煤炭业问题
    方向搜索hdu 1180 诡异的楼梯 楼梯可以变方向的搜索题
    添加设置Android编程心得为TextView添加各种样式
    字符字符串字符串笔试面试题
    设置部门公用流程,上级领导审批,设置注意事项
  • 原文地址:https://www.cnblogs.com/lcqBlogs/p/4280692.html
Copyright © 2011-2022 走看看