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