1. 程式人生 > >Android 狀態模式 介面的呼叫(interface)

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 原始碼設計模式解析與實戰 第二版

本人鄭重宣告,本部落格所編文章、圖片版權歸權利人持有,本博只做學習交流分享所用,不做任何商業用途。訪問者可將本博提供的內容或服務用於個人學習、研究或欣賞,不得用於商業使用。同時,訪問者應遵守著作權法及其他相關法律的規定,不得侵犯相關權利人的合法權利;如果用於商業用途,須徵得相關權利人的書面授權。若文章、圖片的原作者不願意在此展示內容,請及時通知在下,將及時予以刪除。