我們在使用一些剛安裝的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邏輯,使得代碼結構更加的清晰。
總結:
狀態模式把所有相關代碼統一管理,結構清晰。提高了可擴展性和可維護性。但是狀態模式的使用會增加類和對象的個數。