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为重心,给大家带来非常丰富的 ...
随机推荐
- mac上eclipse上运行word count
1.打开eclipse之后,建立wordcount项目 package wordcount; import java.io.IOException; import java.util.StringTo ...
- mac上eclipse上配置hadoop
在mac上安装了eclipse之后,配置hadoop其实跟在linux上配置差不多,只是mac上得eclipse和界面和linux上得有点不同. 一:安装eclipse eclipse得安装比较简单, ...
- 220 DIV2 A. Inna and Pink Pony
Inna and Pink Pony 输入n,m,i,j,a,b 可以看成n行m列的矩阵,起点(i,j),每次移动(a,b),(-a,-b),(-a,b),(a,-b) 可移动到(1,m),(n,1) ...
- HEOI2016游记
DAY -1: 省选前集训因为某些事情感觉心情和状态异常的糟糕 坐在窗户上吹了半个小时的冷风之后觉得回家休息一段时间 (反正我家在保定,大不了我省选的时候直接去河北大学就好辣) 在家里颓了三天吧,想清 ...
- 【mongoDB中级篇②】索引与expain
索引的操作 数据库百分之八十的工作基本上都是查询,而索引能帮我们更快的查询到想要的数据.但是其降低了数据的写入速度,所以要权衡常用的查询字段,不必在太多字段上建立索引. 在mongoDB中默认是用bt ...
- Windows下获取高精度时间注意事项
Windows下获取高精度时间注意事项 [转贴 AdamWu] 花了很长时间才得到的经验,与大家分享. 1. RDTSC - 粒度: 纳秒级 不推荐优势: 几乎是能够获得最细粒度的计数器抛弃理由: ...
- POJ3009——Curling 2.0(DFS)
Curling 2.0 DescriptionOn Planet MM-21, after their Olympic games this year, curling is getting popu ...
- IIS下PHP的三种配置方式比较
在Windows IIS 6.0下配置PHP,通常有CGI.ISAPI和FastCGI三种配置方式,这三种模式都可以在IIS 6.0下成功运行,下面我就讲一下这三种方式配置的区别和性能上的差异. 1. ...
- NFC(2)NFC、蓝牙和红外之间的差异
NFC(2)NFC.蓝牙和红外之间的差异表
- 查看EBS中BI Publisher的版本
查看EBS中BI Publisher的版本问题,Oracle提供了如下的几种方法: 从BI Publisher产生的报表文件查看 通过系统已打过的补丁(Patch)来决定,通过补丁号和BI Publi ...