状态模式学习笔记

定义:当一个对象的内在状态发生改变时,允许改变其行为。
其UML图如下:
在这里图图片描述
Context:环境类,定义客户感兴趣的接口,维护一个State子类的实例,这个实例定义了对象的当前状态。
State:抽象状态类或接口,定义一个或一组接口,表示该状态下的行为;
ConstreteStateA与ConstreteStateB:具体状态类,实现了抽象状态类的接口,从而达到了不同状态下的不同行为。

已登录为例:

UserState为表示状态接口

public interface UserState {

    void forword(Context context);
    void comment(Context context);
}

LoginUserState为实现了UserState接口的具体状态类,表示已经登录

public class LoginUserState implements UserState {
    @Override
    public void forword(Context context) {
        Toast.makeText(context, "转发微博", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void comment(Context context) {
        Toast.makeText(context, "评论微博", Toast.LENGTH_SHORT).show();
    }
}

LogoutUserState具体接口,表示未登录

public class LogoutUserState implements UserState {
    @Override
    public void forword(Context context) {
        gotoLoginActivity(context);
    }

    @Override
    public void comment(Context context) {
        gotoLoginActivity(context);
    }

    private void gotoLoginActivity(Context context) {
        Intent intent = new Intent(context, LoginActivity.class);
        context.startActivity(intent);
    }
}

维护一个State状态的实例,采用单例模式

public class LoginContext {

    private UserState mState = new LogoutUserState();

    private LoginContext(){}

    public void setUserState(UserState userState) {
        this.mState = userState;
    }

    private static LoginContext mInstance = new LoginContext();

    public static LoginContext getLoginContext(){
        return mInstance;
    }

    public void forword(Context context){
        mState.forword(context);
    }

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

调用层根据是登录状态来实现不同行为;

public class MainActivity extends AppCompatActivity {


    private Button transmit;
    private Button logout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        transmit = findViewById(R.id.transmit);

        logout = findViewById(R.id.logout);

        //根据是否已经登录跳转到相应的界面
        transmit.setOnClickListener( v -> {
            LoginContext.getLoginContext().forword(this);
        });

        //退出登录
        logout.setOnClickListener(v -> {
            LoginContext.getLoginContext().setUserState(new LogoutUserState());
        });
    }
}

状态模式关键点是在不同状态下,对于同一行为有不同响应,将if-else用多态实现的具体实例。

发布了13 篇原创文章 · 获赞 2 · 访问量 582

猜你喜欢

转载自blog.csdn.net/qq_42806685/article/details/103783480
今日推荐