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为重心,给大家带来非常丰富的 ...
随机推荐
- javascript加速运动
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- ***php解析html类库simple_html_dom
下载地址:https://github.com/samacs/simple_html_dom 一直以来使用php解析html文档树都是一个难题.Simple HTML DOM parser 帮我们很好 ...
- 【转】Android 实现“再按一次退出程序”
From:http://blog.csdn.net/ldj299/article/details/7574365 个人觉得当用户按下后退键时,出现"再按一次退出"的提示防止误操作比 ...
- unigui判断浏览器内核、操作系统以及是否移动终端函数
function GetDeviceType(var OsName, BrowserName: string; var IsMobileDevice: Boolean): string; var I: ...
- Eclipse项目和MyEclipse项目
因为Eclipse的项目结构和MyEclipse项目的结构不同,所以两者的项目之间不能直接运行的. 我们在创建Eclipse项目的时候可以进行一些设置,这样在Eclipse中创建的项目可以直接在MyE ...
- 54. Spiral Matrix
题目: Given a matrix of m x n elements (m rows, ncolumns), return all elements of the matrix in spiral ...
- Intellij Idea 创建Web项目入门(一)
相关软件: Intellij Idea14:http://pan.baidu.com/s/1nu16VyD JDK7:http://pan.baidu.com/s/1dEstJ5f Tomcat(ap ...
- cocos2dx开发笔记
1.帧动画:SpriteTest=>SpriteAnimationSplit 2.sourceinsight显示代码行 option->document option->editin ...
- NDK(17)让ndk支持完整C++,exception,rtti,
C++ Support The Android platform provides a very minimal C++ runtime support library (/system/lib/li ...
- 新浪实时股票数据接口http://hq.sinajs.cn/list=code
股票数据的获取目前有如下两种方法可以获取:1. http/javascript接口取数据2. web-service接口 1.http/javascript接口取数据1.1Sina股票数据接口以大秦铁 ...