android 设计模式之——状态模式
重点:本内容是在看《Android 源码设计模式》(何红辉 关爱民)著作的书籍记录的学习笔记,就是让自己也按照书中实例敲一遍代码加深印象。
github地址:https://github.com/panda102/DesignModeProject.git
关于状态模式的说明,小木子就不多聊了,主要是记录案例的使用。
功能场景: 用户打开app后,看到某文章,点击转发,此时有两种情况,用户登录和未登录状态,本案例就是基于这两种状态讲解
1.编写界面
2.分析业务逻辑
-
用户打开app,点击转发
-
登录状态下直接转发
-
未登录状态下
3.编写activity业务逻辑(先不考虑具体,主要是点击事件)
MainActivity(转发和注销事件)
/**
* 点击转发
*
* @param view
*/
public void ranspond(View view) {
}
/**
* 注销
*
* @param view
*/
public void logout(View view) {
}
LoginActivity(登录界面登录事件)
/**
* 登录
*
* @param view
*/
public void login(View view) {
Toast.makeText(LoginActivity.this, "登录成功", Toast.LENGTH_SHORT).show();
finish();
}
4.编写状态接口(UserState)
public interface UserState {
/**
* 转发
*
* @param context
*/
void forward(Context context);
/**
* 评论
*
* @param context
*/
void comment(Context context);
}
5.编写具体的状态实现类(登录状态和未登录状态)
/**
* *******************************************************************************************
* 修改日期 修改人 任务名称 功能或Bug描述
* 2019/8/11 MUZI102 登录状态
* *******************************************************************************************
*/
public class LoginedState implements UserState {
@Override
public void forward(Context context) {
Toast.makeText(context, "转发成功", Toast.LENGTH_SHORT).show();
}
@Override
public void comment(Context context) {
Toast.makeText(context, "评价成功", Toast.LENGTH_SHORT).show();
}
}
/**
* *******************************************************************************************
* 修改日期 修改人 任务名称 功能或Bug描述
* 2019/8/11 MUZI102
* *******************************************************************************************
*/
public class LogoutState implements UserState {
@Override
public void forward(Context context) {
gotoLoginActivity(context);
}
@Override
public void comment(Context context) {
gotoLoginActivity(context);
}
/**
* 跳转到登录界面
*/
private void gotoLoginActivity(Context context) {
context.startActivity(new Intent(context, LoginActivity.class));
}
}
6.编写管理状态类(单例模式统方便全局统一管理)
/**
* *******************************************************************************************
* 修改日期 修改人 任务名称 功能或Bug描述
* 2019/8/11 MUZI102
* *******************************************************************************************
*/
public class LoginContext implements UserState {
private static LoginContext mInstant;
/**
* 默认是未登录状态
*/
public UserState mState = new LogoutState();
private LoginContext() {
}
/**
* 单例
*
* @return
*/
public static LoginContext getInstance() {
if (mInstant == null) {
synchronized (LoginContext.class) {
if (mInstant == null)
mInstant = new LoginContext();
}
}
return mInstant;
}
public void setmState(UserState mState) {
this.mState = mState;
}
//转发
@Override
public void forward(Context context) {
mState.forward(context);
}
//评论
@Override
public void comment(Context context) {
mState.comment(context);
}
}
7.登录界面和主界面添加具体是实现逻辑
- MainActivity界面
/**
* 点击转发
*
* @param view
*/
public void ranspond(View view) {
LoginContext.getInstance().forward(MainActivity.this);
}
/**
* 评价
*
* @param view
*/
public void comment(View view) {
LoginContext.getInstance().comment(MainActivity.this);
}
/**
* 注销
*
* @param view
*/
public void logout(View view) {
LoginContext.getInstance().setmState(new LogoutState());
}
- LoginActivity界面
/**
* 登录
*
* @param view
*/
public void login(View view) {
LoginContext.getInstance().setmState(new LoginedState());
Toast.makeText(LoginActivity.this, "登录成功", Toast.LENGTH_SHORT).show();
finish();
}
8.到此基本功能已经出来,后续需要添加等多的状态,只需要在UserState中添加相应的操作,然后在相应的状态实现类里面添加具体的业务逻辑然后使用就ok了