`

behavior_state

阅读更多

状态者模式

本章任务

1.状态者模式的定义

 

状态者模式:不同的状态,不同的行为;或者说,每个状态有着相应的行为.


2.解决我们经常会使用If elseif else 进行状态切换, 且状态的切换反复出现。

eg:"hello"-->"hi"-->"bye"-->"hello"的排列组合

 

package com.aptech.behavior.state;

/**
 * 
 * 文件名: IShopState.java
 * 版权:  方勇
 * 描述:状态者模式--模拟购物的三个状态(购物状态,结账状态,付款状态)
 * 纯有上面一种将"hello"-->"hi"-->"bye"-->"hello"这一个方向切换,
 * 也不一定需要使用State模式,因为State模式会建立很多子类,复杂化,
 * 但是如果又发生另外一个行为:将上面的切换方向反过来切换,
 * 或者需要任意切换,就需要State了.
 * Email:fangyong2006@163.com
 * 修改时间: 2010-7-9下午08:07:46
 */
public interface IShopState {
	  //购物状态
    public void shop();
    //结账状态
    public void generateBill();
    //付款状态
    public void pay();
}

 

package com.aptech.behavior.state;

/**
 * 
 * 文件名: ShopState.java
 * 版权: 方勇
 * 描述:The parent class of state
 * Email:fangyong2006@163.com
 * 修改时间: 2010-7-9下午08:57:50
 */
public class ShopState implements IShopState {
	
	public ShopState() {
	}
	
	public void shop() {
	}
	
	public void generateBill() {
	}
	
	public void pay() {
	}

	/**
	 * 
	 * 〈状态的切换〉
	 * 
	 * @param [ShopContext] [状态管理的上下文]
	 * @param [ShopState] [所有的的购物状态]
	 * @return [void]
	 * @Author 方勇
	 *         Email:fangyong2006@163.com
	 */
	protected void changeState(ShopContext c, ShopState s) {
		c.changeState(s);
	}
}

 

package com.aptech.behavior.state;

/**
 * 
 * 文件名: ShopContext.java
 * 版权:  方勇
 * 描述:状态上下文切换管理器
 * Email:fangyong2006@163.com
 * 修改时间: 2010-7-9下午09:07:10
 */
public class ShopContext {
	
	//正在进行的状态
	private ShopState	currentState;
	
	public ShopContext() {
	}
	
	/**
	 * 
	 * 〈状态的切换〉
	 * @param [ShopState]     [正在进行的状态]
	 * @return  [void]
	 * @Author 方勇
	 * Email:fangyong2006@163.com
	 */
	public void changeState(ShopState s) {
		currentState = s;
	}
	public void shop() {
		currentState.shop();
	}
	public void generateBill() {
		currentState.generateBill();
	}
	public void pay() {
		currentState.pay();
	}
}

 

package com.aptech.behavior.state;

/**
 * 
 * 文件名: Shop.java 
 * 版权: 方勇 
 * 描述:购物状态操作流程
 * Email:fangyong2006@163.com 
 * 修改时间:2010-7-9下午08:52:11
 */
public class Shop extends ShopState {
    public static boolean instanceFlag = false; //true if have 1 instance
    private Shop() {
    }
    public static Shop getInstance() {
        if(! instanceFlag) {
            instanceFlag = true;
            return new Shop();
        }
        return null;
    }
    @Override
		public void shop() {
        System.out.println("The state is shopping now !");
    }
}

 

package com.aptech.behavior.state;

/**
 * 
 * 文件名: GenerateBill.java
 * 版权:  方勇
 * 描述:结账状态操作流程
 * Email:fangyong2006@163.com
 * 修改时间: 2010-7-9下午08:55:34
 */
public class GenerateBill extends ShopState {
	public static boolean	instanceFlag	= false;	// true if have 1 instance
	private GenerateBill() {
	}
	public static GenerateBill getInstance() {
		if (!instanceFlag) {
			instanceFlag = true;
			return new GenerateBill();
		}
		return null;
	}
	public void generateBill() {
		System.out.println("The state is generating bill now !");
	}
}

 

package com.aptech.behavior.state;
/**
 * 
 * 文件名: Pay.java
 * 版权:  方勇
 * 描述:付款状态操作
 * Email:fangyong2006@163.com
 * 修改时间: 2010-7-9下午08:16:15
 */
public class Pay extends ShopState {
    public static boolean instanceFlag = false; //true if have 1 instance
    private Pay() {
    }
    public static Pay getInstance() {
        if(! instanceFlag) {
            instanceFlag = true;
            return new Pay();
        }
        return null;
    }
    public void pay() {
        System.out.println("The state is pay now !");
    }
}

 

package com.aptech.behavior.state;

import junit.framework.TestCase;

public class StateTest extends TestCase {

	protected void setUp() throws Exception {
		super.setUp();
	}

	public void testState(){
		
		//实例化状态管理的上下文
		ShopContext myContext = new ShopContext();
		
		//状态的实例化
		ShopState myShop = Shop.getInstance();
		ShopState myGenBill = GenerateBill.getInstance();
		ShopState myPay = Pay.getInstance();

		//切换为购物状态
		myContext.changeState(myShop);
		myContext.shop();
		
	  //切换为结账状态
		myContext.changeState(myGenBill);
		myContext.generateBill();
		
		//切换为付款状态
		myContext.changeState(myPay);
		myContext.pay();
	}
}

  

本章目标

1. 理解状态者模式

分享到:
评论

相关推荐

    Norms_of_Responsible_State_Behavior_in_Cyberspace.pdf

    • Norm 1: Be more transparent than in the past 比过去更加透明 • Norm 2: Establish and enforce standardized procedures for effective oversight and strong accountability 建立并执行标准化程序,加强有效...

    Python库 | behavior_machine-0.2.3-py3-none-any.whl

    1. **状态(State)** - 表示系统的某个特定阶段或条件。每个状态都可以有一个或多个进入和退出条件,以及一个执行过程。 2. **行为(Behavior)** - 定义系统应如何响应特定的输入或事件。行为可以是单个操作,也...

    Behavior_Trees_in_Robotics_and_AI_An_Introduction.pdf

    行为树(Behavior Trees,简称BTs)是机器人学和人工智能(AI)中用以表示和设计复杂系统行为的架构。它们在管理智能体的行为决策上,相较于传统方法如有限状态机(Finite State Machines,简称FSMs),拥有更好的...

    Android中底部滑入的控件BottomSheetLayout( 第三方 )的使用

    if (bottomSheetBehavior.getState() == BottomSheetBehavior.STATE_EXPANDED) { bottomSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED); } else { bottomSheetBehavior.setState...

    flexbe_behavior_engine:包含行为引擎FlexBE

    安装执行以下命令来安装FlexBE: roscd && cd ../srcgit clone https://github.com/team-vigir/flexbe_behavior_engine.git 此外,为行为开发创建自己的存储库(包含示例): rosrun flexbe_widge

    cordic算法的vhdl实现

    signal current_state, next_state : state_type; -- 当前状态和下一状态信号 begin process (clk) begin if rising_edge(clk) then if reset = '1' then current_state ; else current_state <= next_...

    unity Behavior Designer 文档中文翻译PDF

    Behavior Designer支持与Unity内置的状态机(State Machine)集成,允许更灵活的角色行为管理。 7. **学习资源**: 提供的“Behavior Designer中文版教程.pdf”应包含详细的操作指南、实例演示和最佳实践,帮助...

    Android技术知识点:如何实现自定义带有CardView组件的底部滑动栏

    behavior.setState(BottomSheetBehavior.STATE_EXPANDED); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dialog.show(); } }); ``` ```kotlin // Kotlin ...

    BottomSheet

    - 通过Java或Kotlin代码,你可以获取`BottomSheetBehavior`实例,进一步控制它的状态,例如`BottomSheetBehavior.setState(State.EXPANDED)`来展开,`setState(State.HIDDEN)`来隐藏。 4. **自定义BottomSheet**:...

    Mechanical Behavior of Materials (1)

    2.7 Graphical Solution of a Biaxial State of Stress: the Mohr Circle 89 2.8 Pure Shear: Relationship between G and E 95 2.9 Anisotropic Effects 96 2.10 Elastic Properties of Polycrystals 107 2.11 ...

    Android技术知识点:如何实现自定义带有开关按钮的底部滑动栏

    behavior.setState(BottomSheetBehavior.STATE_COLLAPSED); // 设置监听器,以便在开关按钮点击时控制滑动栏的状态 SwitchMaterial switchButton = findViewById(R.id.switch_button); switchButton....

    BehaviorTree.CPP:C ++中的行为树库。 含电池

    行为树 这个C ++ 14库提供了一个创建BehaviorTrees的框架。 它设计灵活,易于使用,ReactSwift。 即使我们的主要用例是机器人技术,您也可以使用此库来构建游戏的AI或替换应用程序中的有限状态机。 与其他实现相比,...

    Android BottomSheet实现可拉伸控件

    case BottomSheetBehavior.STATE_DRAGGING: state = "拖曳中"; break; case BottomSheetBehavior.STATE_SETTLING: state = "设置中"; break; case BottomSheetBehavior.STATE_EXPANDED: state = "展开"; ...

    Coke Machine State Machine

    - 行为(Behavior):每个状态下允许的动作或功能。 "Coke Machine State Machine" 可能包含一个详细的图形表示,例如UML状态图,用来清晰地展示这些状态、事件、转换和行为之间的关系。通过这样的模型,开发者可以...

    behavior-tree:Behavior使用行为树管理React状态

    行为树工具包 :evergreen_tree: 框架不可知行为树实现 :atom_symbol: -Hooks和docs如何在React中使用BT快速开始npm install @btree/core import { nodes } from '@btree/core'const initialState = { isLoggedIn : ...

    详解Stateflow建模与应用实例,简单stateflow建模实例,matlab源码.zip

    6. **自定义行为(Custom Behavior)**: 除了内置的行为,Stateflow还允许通过编写MATLAB代码实现自定义行为。 应用实例部分可能涵盖了以下主题: - **交通信号灯控制系统**:展示如何使用Stateflow构建一个简单...

    Android 探索BottomSheet的使用

    bottomSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED); // 或STATE_EXPANDED bottomSheetBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() { @Override public ...

    unity Behavior Designer 1.6.6 和Movement Pack

    3. **状态机(State Machine)**:可能用于管理角色的不同行为状态,如巡逻、追逐、逃避等。 4. **感知系统(Sensing System)**:让NPC能够感知环境和其它对象,如检测玩家、声音或视觉刺激。 5. **决策逻辑...

Global site tag (gtag.js) - Google Analytics