android設計模式之狀態模式

我們在使用一些剛安裝的app會發現你需要執行某些操作,例如分享,評論會提示你沒有登錄,然後讓你去登錄。等你成功登錄後就快可以進行相應的操作了。android開發中,如果我們遇到這種情況相信大部分都會直接用if(登錄了){評論成功}else{提示去登錄}。這是我們能想到最簡單快速的解決方法了。但是隨着功能的增加每個地方都去if else會顯得雜亂,不好維護。所以狀態模式就產生了:

package com.example.administrator.zhuangtaimoshi;

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

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        /**
         * 評論
         */
        LoginContext.getInstance().comment(this);
        /**
         * 分享
         */
        LoginContext.getInstance().share(this);
        /**
         * 設置登錄成功
         */
        LoginContext.getInstance().setLoginState(new LoginedState());
    }
}

我們把具體有關狀態的操作都交給LoginContext,來看看具體代碼:

package com.example.administrator.zhuangtaimoshi;

import android.content.Context;

/**
 * Created by Administrator on 2016/12/18.
 */

public class LoginContext {
    /**
     * 默認未登錄狀態
     */
    private LoginState loginState = new LoginOutState();
    /**
     * 單例模式
     */
    static LoginContext loginContext = new LoginContext();

    private LoginContext() {

    }

    public static LoginContext getInstance() {
        return loginContext;
    }

    public void setLoginState(LoginState loginState) {
        this.loginState = loginState;
    }

    public void share(Context context) {
        loginState.share(context);
    }

    public void comment(Context context) {
        loginState.comment(context);
    }

}

LoginState是一個接口,定義了share和comment兩個方法,有兩個實現類LoginedState和LoginOut(已登錄和未登錄),然後通過setLoginState來對狀態進行修改,並把分享和評論操作委託給了具體的狀態對象。

package com.example.administrator.zhuangtaimoshi;

import android.content.Context;
import android.widget.Toast;

/**
 * Created by Administrator on 2016/12/18.
 * 登錄成功的狀態
 */

public class LoginedState implements LoginState {

    @Override
    public void share(Context context) {
        Toast.makeText(context, "分享成功", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void comment(Context context) {
        Toast.makeText(context, "評論成功", Toast.LENGTH_SHORT).show();
    }
}
package com.example.administrator.zhuangtaimoshi;

import android.content.Context;
import android.widget.Toast;

/**
 * Created by Administrator on 2016/12/18.
 * 沒有登錄的狀態
 */

public class LoginOutState implements LoginState {

    @Override
    public void share(Context context) {
        Toast.makeText(context, "請登錄", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void comment(Context context) {
        Toast.makeText(context, "請登錄", Toast.LENGTH_SHORT).show();
    }
}

這樣以來就消除了重複的if-else邏輯,使得代碼結構更加的清晰。

總結:
狀態模式把所有相關代碼統一管理,結構清晰。提高了可擴展性和可維護性。但是狀態模式的使用會增加類和對象的個數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章