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为重心,给大家带来非常丰富的 ...
随机推荐
- js正则函数match、exec、test、search、replace、split使用介绍
match() 使用正则表达式模式对字符串执行查找,并将包含查找的结果作为数组返回. stringObj.match(rgExp) stringObj 必选项.对其进行查找的 String 对象或字符 ...
- java基础知识回顾之java集合类-Properties集合
/** java.lang.Object |--java.util.Dictionary<K,V> |--java.util.Hashtable<Object,Obje ...
- 李洪强iOS开发之【Objective-C】08-self关键字
一.Java中的this只能用在动态方法中,不能用在静态方法中 1.在动态方法中使用this关键字 1 public class Student { 2 private int age; 3 publ ...
- linux上tomcat安装
转载:http://my.oschina.net/zmf/blog/309484 tomcat安装 下载后解压:tar -zxvf apache-tomcat-7.0.28 移动到/usr/local ...
- RunAsAdmin in windows 8
function RunAsAdmin(hWnd: HWND; filename: string; Parameters: string): Boolean; { See Step 3: Redesi ...
- App应用与思考
我为什么没有加入苹果的iOS APP移动大军?http://blog.csdn.net/Code_GodFather/article/details/7956858 ----------------- ...
- 函数执行到return就结束了
遇到return,函数就结束了,不会往下执行 测试: class User { String name; int age; boolean fun1(int i){ if(i==1){ return ...
- 33. Search in Rotated Sorted Array
题目: Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 ...
- Ossec常用命令
启动并查看httpd服务 systemctl start httpd systemctl status httpd.service 启动并查看mysql服务 systemctl start maria ...
- 机器学习 —— 概率图模型(学习:CRF与MRF)
在概率图模型中,有一类很重要的模型称为条件随机场.这种模型广泛的应用于标签—样本(特征)对应问题.与MRF不同,CRF计算的是“条件概率”.故其表达式与MRF在分母上是不一样的. 如图所示,CRF只对 ...