Android开源项目SlidingMenu深切解析
当一个对象行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式了。
State类:抽象状态类,定义一个接口以封装与Context的一个特定状态相关的行为。
ConcreteStateA,ConcreteStateB,ConcreteStateC类:具体状态类,每一个子类实现一个与Context的一个状态相关的行为。
- package com.liangdianshui;
- /**
- * 投篮机1
- *
- * @author liangdianshui
- *
- */
- public class ShootingMachine {
- // 投篮机有三个状态(已投币,未投币,计分中),分别用三个常量来表示
- private final static int HAS_COIN = 0;
- private final static int NO_COIN = 1;
- private final static int SCORING = 2;
- private int mCurrentStatus = NO_COIN;
- /**
- * 初始化的时候,设置投篮机的状态为未投币的状态
- */
- public ShootingMachine() {
- mCurrentStatus = NO_COIN;
- }
- /**
- * 投币的动作(方法) 玩家在上面的三种状态中都有可能投币
- */
- public void insertCoin() {
- switch (mCurrentStatus) {
- case HAS_COIN:
- System.out.println("已有硬币,不需要重复投币");
- break;
- case NO_COIN:
- mCurrentStatus = HAS_COIN;
- System.out.println("投币成功");
- break;
- case SCORING:
- System.out.println("游戏正在开始,请稍后投币");
- break;
- }
- }
- /**
- * 退币的动作(方法) 玩家在上面的三种状态中都有可能退币
- */
- public void backtCoin() {
- switch (mCurrentStatus) {
- case HAS_COIN:
- mCurrentStatus = NO_COIN;
- System.out.println("退币成功");
- break;
- case NO_COIN:
- System.out.println("未投入硬币");
- break;
- case SCORING:
- System.out.println("游戏正在进行,不能退币");
- break;
- }
- }
- /**
- * 按下开始按钮的动作(方法) 玩家在上面的三种状态中都有可能按下开始的按钮
- */
- public void startScoring() {
- switch (mCurrentStatus) {
- case HAS_COIN:
- mCurrentStatus = SCORING;
- System.out.println("游戏开始进行");
- scoring();
- break;
- case NO_COIN:
- System.out.println("请投币");
- break;
- case SCORING:
- System.out.println("游戏正在进行");
- break;
- }
- }
- /**
- * 投篮机计分中
- */
- public void scoring() {
- try {
- Thread.sleep(1000); // 模拟时间
- System.out.println("时间到,游戏结束");
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- mCurrentStatus = NO_COIN;
- }
- }
测试类代码:
- package com.liangdianshui;
- public class Test {
- public static void main(String[] args) {
- ShootingMachine machine = new ShootingMachine();
- System.out.println("----------投币退币---------");
- machine.insertCoin();
- machine.backtCoin();
- System.out.println("----------投币计分---------");
- machine.insertCoin();
- machine.startScoring();
- System.out.println("----------压力测试---------");
- machine.insertCoin();
- machine.insertCoin();
- machine.backtCoin();
- machine.backtCoin();
- machine.backtCoin();
- machine.startScoring();
- machine.startScoring();
- machine.backtCoin();
- }
- }
实现的效果:
- package com.liangdianshui;
- public interface State {
- // 投币
- public void insertCoin();
- // 退币
- public void backtCoin();
- // 按下开始按钮
- public void startScoring();
- // 投篮机计分中
- public void scoring();
- // 出奖品卷
- public void putPrizeRoll();
- }
每个状态的实现类:
- package com.liangdianshui;
- /**
- * 有投币的状态
- *
- * @author liangdianshui
- *
- */
- public class HasCoinState implements State {
- private ShootingMachine mShootingMachine;
- public HasCoinState(ShootingMachine shootingMachine) {
- this.mShootingMachine = shootingMachine;
- }
- @Override
- public void insertCoin() {
- // TODO Auto-generated method stub
- System.out.println("已有硬币,不需要重复投币");
- }
- @Override
- public void backtCoin() {
- // TODO Auto-generated method stub
- System.out.println("退币成功");
- mShootingMachine.setState(mShootingMachine.getNoCoinState());
- }
- @Override
- public void startScoring() {
- // TODO Auto-generated method stub
- System.out.println("游戏开始进行");
- mShootingMachine.setState(mShootingMachine.getScoringState());
- mShootingMachine.scoring();
- }
- @Override
- public void scoring() {
- // TODO Auto-generated method stub
- }
- @Override
- public void putPrizeRoll() {
- // TODO Auto-generated method stub
- }
- }
- package com.liangdianshui;
- /**
- * 未投币的状态
- *
- * @author liangdianshui
- *
- */
- public class NoCoinState implements State {
- private ShootingMachine mShootingMachine;
- public NoCoinState(ShootingMachine shootingMachine) {
- this.mShootingMachine = shootingMachine;
- }
- @Override
- public void insertCoin() {
- // TODO Auto-generated method stub
- System.out.println("投币成功");
- mShootingMachine.setState(mShootingMachine.getHasCoinState());
- }
- @Override
- public void backtCoin() {
- // TODO Auto-generated method stub
- System.out.println("未投入硬币");
- }
- @Override
- public void startScoring() {
- // TODO Auto-generated method stub
- System.out.println("请投币");
- }
- @Override
- public void scoring() {
- // TODO Auto-generated method stub
- }
- @Override
- public void putPrizeRoll() {
- // TODO Auto-generated method stub
- }
- }
- package com.liangdianshui;
- /**
- * 出奖品卷的状态
- *
- * @author liangdianshui
- *
- */
- public class PutPrizeRollState implements State {
- private ShootingMachine mShootingMachine;
- public PutPrizeRollState(ShootingMachine shootingMachine) {
- this.mShootingMachine = shootingMachine;
- }
- @Override
- public void insertCoin() {
- // TODO Auto-generated method stub
- System.out.println("正在出奖品卷,请稍后投币");
- }
- @Override
- public void backtCoin() {
- // TODO Auto-generated method stub
- System.out.println("正在出奖品卷,不能退币");
- }
- @Override
- public void startScoring() {
- // TODO Auto-generated method stub
- System.out.println("正在出奖品卷,不能开始游戏");
- }
- @Override
- public void scoring() {
- // TODO Auto-generated method stub
- }
- @Override
- public void putPrizeRoll() {
- // TODO Auto-generated method stub
- try {
- Thread.sleep(1000); // 模拟出奖品卷
- System.out.println("出奖品卷完成");
- mShootingMachine.setState(mShootingMachine.getNoCoinState());
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
- package com.liangdianshui;
- import java.util.Random;
- /**
- * 计分中的状态
- *
- * @author liangdianshui
- *
- */
- public class ScoringState implements State {
- private ShootingMachine mShootingMachine;
- private Random random = new Random();
- public ScoringState(ShootingMachine shootingMachine) {
- this.mShootingMachine = shootingMachine;
- }
- @Override
- public void insertCoin() {
- // TODO Auto-generated method stub
- System.out.println("游戏正在开始,请稍后投币");
- }
- @Override
- public void backtCoin() {
- // TODO Auto-generated method stub
- System.out.println("游戏正在进行,不能退币");
- }
- @Override
- public void startScoring() {
- // TODO Auto-generated method stub
- System.out.println("游戏正在进行");
- scoring();
- }
- @Override
- public void scoring() {
- // TODO Auto-generated method stub
- int randNum = random.nextInt(80) + 15; // 随机生成15到94的一个随机数,代表游戏的分数
- try {
- Thread.sleep(1000); // 模拟时间
- if (randNum > 50) {
- System.out.println("时间到,您的分数是:" + randNum + ",恭喜你获取到奖品卷");
- mShootingMachine.setState(mShootingMachine.getPutPrizeRollState());
- mShootingMachine.putPrizeRollState();
- } else {
- System.out.println("时间到,您的分数是:" + randNum + ",游戏结束");
- }
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- @Override
- public void putPrizeRoll() {
- // TODO Auto-generated method stub
- }
- }
然后写个投篮机的实现类:
- package com.liangdianshui;
- /**
- * 投篮机2
- *
- * @author liangdianshui
- *
- */
- public class ShootingMachine {
- private State hasCoinState;
- private State noCoinState;
- private State putPrizeRollState;
- private State scoringState;
- private State mCurrentStatus = noCoinState;
- public ShootingMachine() {
- hasCoinState = new HasCoinState(this);
- noCoinState = new NoCoinState(this);
- putPrizeRollState = new PutPrizeRollState(this);
- scoringState = new ScoringState(this);
- mCurrentStatus = noCoinState;
- }
- /**
- * 设置投篮机的状态
- */
- public void setState(State state) {
- this.mCurrentStatus = state;
- }
- // 投币
- public void insertCoin() {
- mCurrentStatus.insertCoin();
- }
- // 退币
- public void backtCoin() {
- mCurrentStatus.backtCoin();
- }
- // 按下开始游戏的按钮
- public void startScoring() {
- mCurrentStatus.startScoring();
- }
- // 投篮机计分中
- public void scoring() {
- mCurrentStatus.scoring();
- }
- // 出奖品卷
- public void putPrizeRollState() {
- mCurrentStatus.putPrizeRoll();
- }
- public State getHasCoinState() {
- return hasCoinState;
- }
- public void setHasCoinState(State hasCoinState) {
- this.hasCoinState = hasCoinState;
- }
- public State getNoCoinState() {
- return noCoinState;
- }
- public void setNoCoinState(State noCoinState) {
- this.noCoinState = noCoinState;
- }
- public State getPutPrizeRollState() {
- return putPrizeRollState;
- }
- public void setPutPrizeRollState(State putPrizeRollState) {
- this.putPrizeRollState = putPrizeRollState;
- }
- public State getScoringState() {
- return scoringState;
- }
- public void setScoringState(State scoringState) {
- this.scoringState = scoringState;
- }
- }
测试类:
- package com.liangdianshui;
- public class Test {
- public static void main(String[] args) {
- ShootingMachine machine = new ShootingMachine();
- System.out.println("----------投币退币---------");
- machine.insertCoin();
- machine.backtCoin();
- System.out.println("----------投币,开始投篮1---------");
- machine.insertCoin();
- machine.startScoring();
- System.out.println("----------投币,开始投篮2---------");
- machine.insertCoin();
- machine.startScoring();
- System.out.println("----------投币,开始投篮3---------");
- machine.insertCoin();
- machine.startScoring();
- System.out.println("----------压力测试---------");
- machine.insertCoin();
- machine.insertCoin();
- machine.backtCoin();
- machine.backtCoin();
- machine.backtCoin();
- machine.startScoring();
- machine.startScoring();
- machine.backtCoin();
- }
- }
最后来看下运行的结果:
Android开源项目SlidingMenu深切解析的更多相关文章
- Android 开源项目源码解析(第二期)
Android 开源项目源码解析(第二期) 阅读目录 android-Ultra-Pull-To-Refresh 源码解析 DynamicLoadApk 源码解析 NineOldAnimations ...
- Android开源项目SlidingMenu本学习笔记(两)
我们已经出台SlidingMenu使用:Android开源项目SlidingMenu本学习笔记(一个),接下来再深入学习下.依据滑出项的Menu切换到相应的页面 文件夹结构: watermark/2/ ...
- Android开源项目SlidingMenu学习(二)
前一篇SlidingMenu学习(一)文章中了解了导入SlidingMenu到我们项目经常出现的问题,下面我们正式学习. 先看一个效果: 看到两幅图片的差别了吗,左边的一栏时可以滑动的,可以隐藏掉,现 ...
- Android开源项目SlidingMenu深入剖析
SlidingMenu简介: SlidingMenu的是一种比较新的设置界面或配置界面效果,在主界面左滑或者右滑出现设置界面,能方便的进行各种操作.目前有大量的应用都在使用这一效果.如Evernote ...
- Android开源项目SlidingMenu的学习笔记(一)
SlidingMenu是眼下在应用程序上非常流行的一种UI技术.能够实现一种比較炫的滑动效果,SlidingMenu是Git上托管的一个项目,开源免费的.SlidingMenu作为一个Library的 ...
- [原创]android开源项目源码解析(一)----CircleImageView的源码解析
CircleImageView的代码很简洁,因此先将此工程作为源码解析系列的第一篇文章. 解析说明都在代码里了. /* * Copyright 2014 - 2015 Henning Dodenhof ...
- Android 开源项目及其学习
Android 系统研究:http://blog.csdn.net/luoshengyang/article/details/8923485 Android 腾讯技术人员博客 http://hukai ...
- 【Android UI设计与开发】9:滑动菜单栏(一)开源项目SlidingMenu的使用和示例
一.SlidingMenu简介 相信大家对SlidingMenu都不陌生了,它是一种比较新的设置界面或配置界面的效果,在主界面左滑或者右滑出现设置界面效果,能方便的进行各种操作.很多优秀的应用都采用了 ...
- 【Android UI设计与开发】第17期:滑动菜单栏(二)开源项目SlidingMenu的示例
通过上一篇文章的讲解,相信大家对于开源项目SlidingMenu都有了一个比较初步的了解(不了解的可以参考上 一篇文章),那么从这一章开始,博主将会以SlidingMenu为重心,给大家带来非常丰富的 ...
随机推荐
- Oracle 6 - 锁和闩 - 锁类型
Oracle锁大类 1.DML锁 (SELECT, INSERT, UPDATE, DELETE, MERGE是对数据库加的锁, 可能是行锁,也可能是表锁) 2.DDL锁 (Create, Alter ...
- JAX-RS 2.0 REST客户端编程实例
JAX-RS 2.0 REST客户端编程实例 2014/01/28 | 分类: 基础技术, 教程 | 0 条评论 | 标签: JAX-RS, RESTFUL 分享到:3 本文由 ImportNew - ...
- Servlet小示例:jsp页面提交信息Servlet接收并打印输出
该示例采用doPost方法提交表单,该示例一共包含两个文件. 一个是用来提交用户信息的表单userForm2.jsp,另一个是用来接收参数的Servlet. userForm2.jsp <%@ ...
- 10、JPA_映射双向多对多的关联关系
双向多对多的关联关系 双向多对多的关联关系(抽象成A-B)具体体现:A中有B的集合的引用,同时B中也有对A的集合的引用.A.B两个实体对应的数据表靠一张中间表来建立连接关系. 同时我们还知道,双向多对 ...
- RMI
Java RMI (Remote Method Invocation 远程方法调用)是用Java在JDK1.1中实现的,它大大增强了Java开发分布式应用的能力.Java作为一种风靡一时的网络开发语言 ...
- (转)MyEclipse +Servlet
来自:http://www.cnblogs.com/sunada2005/p/3520788.html 在Win7系统下运行自己的第一个Servlet程序,因为有时候配置不当或系统原因可能会运行不成功 ...
- ACM刷题常用链接
武汉科技大学 http://acm.wust.edu.cn/ 华中科技大学 http://acm.hust.edu.cn/vjudge/toIndex.action 杭州电子科技大学 http:/ ...
- Delphi使用JSON解析调用淘宝IP地址库REST API 示例
淘宝IP地址库:http://ip.taobao.com,里面有REST API 说明. Delphi XE 调试通过,关键代码如下: var IdHTTP: TIdHTTP; RequestURL: ...
- 如何使用UIAutomation进行iOS 自动化测试(Part I)
转自:http://www.cnblogs.com/vowei/archive/2012/08/10/2631949.html 写在前面 研究iOS的自动化测试也有些日子了,刚开始的时候,一直苦于找不 ...
- Codeforces Round #248 (Div. 2) C. Ryouko's Memory Note (vector 替换)
题目链接 题意:给m个数字, 这些数字都不大于 n, sum的值为相邻两个数字 差的绝对值.求这n个数字里把一个数字 用 其中另一个数字代替以后, 最小的sum值. 分析:刚开始以为两个for 最坏 ...