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为重心,给大家带来非常丰富的 ...
随机推荐
- C# 面向对象之概念理解(3)
多态 多态是指两个或多个属于不同类的对象,对同一个消息(方法调用)做出不同响应的能力. 多态(<韦氏大词典>)中定义:可以呈现不同形式的能力或状态. C#如何实现多态的知识——即继承上覆载 ...
- Sina App Engine(SAE)入门教程(5)- SaeSegment(中文分词服务)使用
分词能干什么? 提取一篇文章的关键字 检测特定的段落中有没有违禁词 智能机器人 …..尽你所想 开启SAE 分词服务 首先你需要在sae的管理面板开始分词服务后才能使用sae的服务.具体的开启操作: ...
- VirtualUI - Convert your Windows App to HTML5
http://www.cybelesoft.com/thinfinity/virtualui/
- tomcat version
Tomcat version 6.0 only supports J2EE 1.2, 1.3, 1.4, and Java EE 5 Web modules 转自:http://jingwang0 ...
- Axel linux下多线程下载工具
Axel 是 Linux 下一个不错的HTTP/FTP高速下载工具.支持多线程下载.断点续传,且可以从多个地址或者从一个地址的多个连接来下载同一个文件.适合网速不给力时多线程下载提高下载速度.比如在国 ...
- renameTo()方法的用法
使用renameTo()方法,可以将文件data.txt从C:\JavaApp\IOTest1\目录移动到C:\目录,并改名为newdata.txt import java.io.File; //将文 ...
- Maven那点事儿(Eclipse版)
Maven那点事儿(Eclipse版) 前言: 由于最近工作学习,总是能碰到Maven的源码.虽然平时工作并不使用Maven,但是为了学习一些源码,还是必须要了解下.这篇文章不是一个全面的Mave ...
- C# 使用AutoResetEvent进行线程同步
AutoResetEvent 允许线程通过发信号互相通信. 通常,当线程需要独占访问资源时使用该类. 线程通过调用 AutoResetEvent 上的 WaitOne 来等待信号. 如果 AutoRe ...
- MapReduce编程系列 — 5:单表关联
1.项目名称: 2.项目数据: chile parentTom LucyTom JackJone LucyJone JackLucy MaryLucy Ben ...
- SQL 分组排序分页(大神帮写的膜拜一下)
查询全部: SELECT P3.ID, P3.Name, P3.AddTimeFROM (SELECT Name, MAX(AddTime) AS MaxAddTime FROM Product AS ...