Android 状态模式 接口的调用(interface)

1、状态模式介绍

状态模式的行为是由状态决定的,不同的状态有不同的行为。

2、状态模式的定义

当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。

3、状态模式的使用场景

(1)一个对象的行为取决于他的状态,并且它必须在运行时根据状态来改变行为。
(2)代码中包含了大量与对象有关的语句,if-else switch-case

4、状态模式的UML 类图

在这里插入图片描述

1)、Context:环境类,定义客户感兴趣的接口,维护一个State 子类的实例,这个实例定义了对象的当前状态。

2)State: 抽象状态类,或者状态接口,定义一个或者一组接口,表示该状态下的行为。

3)ConcreteStateA、ConcreteStateB: 具体状态类,每一个具体的状态类实现抽State 中定义的接口,从而达到不同状态下的不同行为。

5、状态模式的简单示例

我们就以电视遥控器为例来演示状态模式的实现,我们简单将电视的状态分为:
开机状态 、 关机状态

再 开机状态 下通过遥控器进行 频道的切换、调整音量等都是有效的。
在 关机状态 下通过遥控器进行 频道的切换、调整音量等都是无效的。

6、代码结构

在这里插入图片描述

1)TvStateOperate 接口,定义了对遥控器的操作方法
2)PowerOnState  添加 TvStateOperate 接口,复写 电视打开状态下的操作方法
3)PowerOffState  添加 TvStateOperate 接口,复写 电视关闭状态下的操作方法
4)PowerController 接口,定义了对电视状态的设定 开机 、 关机
5)TvController 添加 PowerController 接口,对电视状态进行 设定,传递 状态参数
6)MainActivity 对电视进行操作

1) TvStateOperate 接口文件
package com.example.ubuntu.mystateinterface;


//电视状态接口,定义了电视操作的函数
public interface TvStateOperate {
    public void nextChannel();
    public void prevChannel();
    public void turnUp();
    public void turnDown();
}

2)、PowerOnState 开机状态下操作
package com.example.ubuntu.mystateinterface;

import android.util.Log;

public class PowerOnState implements TvStateOperate {

    private String TAG = "PowerOnState: ";

    @Override
    public void nextChannel() {
        Log.i(TAG,"前往下一频道");
    }

    @Override
    public void prevChannel() {
        Log.i(TAG,"前往上一频道");

    }

    @Override
    public void turnUp() {
        Log.i(TAG,"不可用 电视已经是打开状态");
    }

    @Override
    public void turnDown() {
        Log.i(TAG,"关闭电视");

    }
}

3)、PowerOffState 关机状态下 操作过程
package com.example.ubuntu.mystateinterface;


import android.util.Log;

//关机状态,此时只有开机的功能可以使用
public class PowerOffState implements TvStateOperate {
    private String  TAG = "PowerOffState: ";

    @Override
    public void nextChannel() {
        Log.i(TAG,"下一频道不可用");
    }

    @Override
    public void prevChannel() {
        Log.i(TAG,"前一频道不可用");

    }

    @Override
    public void turnUp() {
        Log.i(TAG,"电视打开");

    }

    @Override
    public void turnDown() {
        Log.i(TAG,"不可用电视已经是关闭状态");

    }
}

4)、PowerController 电视状态设定接口
package com.example.ubuntu.mystateinterface;

public interface PowerController {

    public void powerOn();
    public void powerOff();

}

5)、TvController 设定电视状态 传递参数
package com.example.ubuntu.mystateinterface;

import android.util.Log;

public class TvController implements PowerController {

    private String TAG = "TvController: ";
    private TvStateOperate tvStateOperate;


    public void setTvState(TvStateOperate tvState){
        this.tvStateOperate = tvState;
    }


    @Override
    public void powerOn() {
    setTvState(new PowerOnState());
        Log.i(TAG,"开机了");
    }

    @Override
    public void powerOff() {
        setTvState(new PowerOffState());
        Log.i(TAG,"关机了");
    }

    public void nextChannel(){
        tvStateOperate.nextChannel();
    }

    public void preChannel(){
        tvStateOperate.prevChannel();
    }

    public void turnUp(){
        tvStateOperate.turnUp();
    }

    public  void turnDown(){
        tvStateOperate.turnDown();
    }
}

6、 MainActivity 文件
package com.example.ubuntu.mystateinterface;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    private String TAG = "MainActivity: ";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        TvController tvController = new TvController();

        tvController.powerOn();     //设置开机状态
        tvController.nextChannel();//下一频道
        tvController.preChannel();//前一频道
        tvController.turnUp(); //开机
        tvController.turnDown(); //关机


        tvController.powerOff();//设置关机状态
        tvController.nextChannel();//下一频道
        tvController.preChannel();//前一频道
        tvController.turnDown(); //关机
        tvController.turnUp(); //开机
    }
}

7)、log 打印

在这里插入图片描述

文献参考:
Android 源码设计模式解析与实战 第二版

本人郑重声明,本博客所编文章、图片版权归权利人持有,本博只做学习交流分享所用,不做任何商业用途。访问者可將本博提供的內容或服务用于个人学习、研究或欣赏,不得用于商业使用。同時,访问者应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人的合法权利;如果用于商业用途,须征得相关权利人的书面授权。若文章、图片的原作者不愿意在此展示內容,请及时通知在下,將及时予以刪除。

猜你喜欢

转载自blog.csdn.net/qq_27061049/article/details/84397398