state框架分析,多态,接口,综合案例

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、调用以后的代码。

继承是为了多态!

如果说继承是为了重用代码,可以用组合,把代码写成静态的,直接调用不行吗?

记住 继承是为了多态!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值