state框架分析:
状态相当于模块(状态)。
案例:
点击屏幕不同位置,显示到不同状态。
包:package framework:
interface BaseState类:
class GameView类
包:package state:
class MainMenuState,GameState,HelpState
类图:
程序细化:
代码
BaseState接口
package com.example.framework;
import android.graphics.Canvas;
import android.graphics.Paint;
/**
* 接口
*/
public interface BaseState {
public void draw(Canvas canvas,Paint paint);
public void touchEvent(int x,int y);
}
MainMenuState类
package com.example.state;
import android.graphics.Canvas;
import android.graphics.Paint;
import com.example.framework.BaseState;
import com.example.framework.GameView;
/**
*
* 接口实现类
*
*/
public class MainMenuState implements BaseState{
@Override
public void draw(Canvas canvas, Paint paint) {
canvas.drawText("游戏", 100, 50, paint);
canvas.drawText("游戏", 100, 300, paint);
}
@Override
public void touchEvent(int x, int y) {
if(y>400){
GameView.currentState=3;//help
}else{
GameView.currentState=2;//game
}
}
}
HelpState类
package com.example.state;
import android.graphics.Canvas;
import android.graphics.Paint;
import com.example.framework.BaseState;
import com.example.framework.GameView;
public class HelpState implements BaseState{
@Override
public void draw(Canvas canvas, Paint paint) {
canvas.drawText("帮助", 100, 200, paint);
}
@Override
public void touchEvent(int x, int y) {
if (y>400 && x>240)
{
GameView.currentState=1;//mainMenu
}
}
}
GameState类
package com.example.state;
import android.graphics.Canvas;
import android.graphics.Paint;
import com.example.framework.BaseState;
import com.example.framework.GameView;
public class GameState implements BaseState{
@Override
public void draw(Canvas canvas, Paint paint) {
canvas.drawText("游戏", 100, 200, paint);
}
@Override
public void touchEvent(int x, int y) {
if (y>400 && x>240)
{
GameView.currentState=1;//mainMenu
}
}
}
GameView
package com.example.framework;
import com.example.state.GameState;
import com.example.state.HelpState;
import com.example.state.MainMenuState;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.view.MotionEvent;
import android.view.View;
public class GameView extends View{
public static int currentState;
MainMenuState mainMenuState;
GameState gameState;
HelpState helpState;
public GameView(Context context) {
super(context);
currentState=1;
mainMenuState=new MainMenuState();
gameState=new GameState();
helpState=new HelpState();
}
@Override
protected void onDraw(Canvas canvas) {
Paint paint=new Paint();
paint.setTextSize(68);
switch (currentState) {
case 1:
mainMenuState.draw(canvas, paint);
break;
case 2:
gameState.draw(canvas, paint);
break;
case 3:
helpState.draw(canvas, paint);
break;
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int x=(int) event.getX();
int y=(int) event.getY();
switch (currentState) {
case 1:
mainMenuState.touchEvent(x, y);
break;
case 2:
gameState.touchEvent(x, y);
break;
case 3:
helpState.touchEvent(x, y);
break;
}
//间接调用,调用onDraw()
invalidate();
return super.onTouchEvent(event);
}
}
MainActivity类
package com.example.state;
import com.example.framework.GameView;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new GameView(this));
}
}
增加或删除功能时GameView一行代码也不变
当用户功能改动时,不能让整个程序都改,编程时要掉接口!
package com.example.stateframework.framework;
import com.example.stateframework.state.GameState;
import com.example.stateframework.state.HelpState;
import com.example.stateframework.state.MainMenuState;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.view.DragEvent;
import android.view.MotionEvent;
import android.view.View;
public class GameView extends View {
public static BaseState currentState;
// 现状:增加一个关于功能或删了一个功能 gameView要改
// 优化目标:增加一个关于功能AboutState,MainMenstState中让currentState指向AboutState
// 或删了一个功能 gameView一行代码不变。
public GameView(Context context, BaseState state) {
super(context);
currentState = state;
}
@Override
protected void onDraw(Canvas canvas) {
Paint paint = new Paint();
paint.setTextSize(68);
//调接口:
//多态:运行时接口指向不同的实现类
this.currentState.draw(canvas, paint);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int x = (int) event.getX();
int y = (int) event.getY();
this.currentState.touchEvent(x, y);
// 间接调用,调用onDraw()
invalidate();
return super.onTouchEvent(event);
}
}
package com.example.state;
import android.graphics.Canvas;
import android.graphics.Paint;
import com.example.framework.BaseState;
import com.example.framework.GameView;
public class GameState implements BaseState{
@Override
public void draw(Canvas canvas, Paint paint) {
canvas.drawText("游戏", 100, 200, paint);
}
@Override
public void touchEvent(int x, int y) {
if (y>400 && x>240)
{
//GameView.currentState=1;//mainMenu
MainMenuState mainMenuState=new MainMenuState();
GameView.currentState=mainMenuState;
}
}
}
package com.example.state;
import android.graphics.Canvas;
import android.graphics.Paint;
import com.example.framework.BaseState;
import com.example.framework.GameView;
/**
*
* 接口实现类
*
*/
public class MainMenuState implements BaseState{
@Override
public void draw(Canvas canvas, Paint paint) {
canvas.drawText("游戏", 100, 50, paint);
canvas.drawText("游戏", 100, 300, paint);
}
@Override
public void touchEvent(int x, int y) {
if(y>400){
//改动:指向接口的实现类
HelpState helpState=new HelpState();
GameView.currentState=helpState;
// GameView.currentState=3;//help
}else{
GameState gameState=new GameState();
GameView.currentState=gameState;
// GameView.currentState=2;//game
}
}
}
package com.example.state;
import android.graphics.Canvas;
import android.graphics.Paint;
import com.example.framework.BaseState;
import com.example.framework.GameView;
public class HelpState implements BaseState{
@Override
public void draw(Canvas canvas, Paint paint) {
canvas.drawText("帮助", 100, 200, paint);
}
@Override
public void touchEvent(int x, int y) {
if (y>400 && x>240)
{
//GameView.currentState=1;//mainMenu
MainMenuState mainMenuState=new MainMenuState();
GameView.currentState=mainMenuState;
}
}
}
package com.example.state;
import com.example.framework.GameView;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MainMenuState mianMenuState=new MainMenuState();
setContentView(new GameView(this,mianMenuState));
}
}
java 中多态的应用
1、callback 回调。
2、调用以后的代码。
继承是为了多态!
如果说继承是为了重用代码,可以用组合,把代码写成静态的,直接调用不行吗?
记住 继承是为了多态!