状态模式
简介
状态模式中的行为是由状态来决定的,
不同状态下有不同的行为.
就是说当一个对象的内在状态改变是允许改变其行为
这个对象看起来像是改变了其类
使用场景
1 一个对象的行为取决于他的状态,并且他必须在运行是根据状态改变他的行为
2 代码中有大量的if switch 语句
状态模式将每一个条件分支放入一个独立的类中,让你可以更具对象自身的情况将对象的状态作为一个
对象 这对象可以不依赖其他对象而独立变化,这样通过多态来去除过多的if语句
从而提高代码的扩展性和可读性
代码
/**
* 游客模式和登录模式
* 在进入app后没有登录和登录后是两种状态
* 故此用状态模式
* 万一以后在加个什么学生模式或者老师模式 也方便代码的扩展性
* <p>
* 但是现在体会到的就是这样的模式虽然方便了扩展性
* 但是 增加了代码量 减低了代码的可读新
* 所以 这样的模式应该是用在整个app,模块或者一个复杂的功能上,而不是一个界面
* 一个小功能上
*/
public class MainActivity extends AppCompatActivity {
public static UserState mUserState;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.main_btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mUserState == null) {
mUserState = new LogoutState();
}
//点击分享
mUserState.forward(MainActivity.this);
}
});
findViewById(R.id.main_login_btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//登录跳转
Intent intent = new Intent(MainActivity.this, LoginActivity.class);
startActivity(intent);
}
});
}
}
public class LoginActivity extends AppCompatActivity {
private UserState logoutState;
private UserState loginState;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
logoutState = new LogoutState();
loginState = new LoginState();
findViewById(R.id.login_login_btn).setOnClickListener(mClickListener);
findViewById(R.id.login_logout_btn).setOnClickListener(mClickListener);
}
View.OnClickListener mClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.login_login_btn:
//点击登录
loginState.saveUserInfo();
MainActivity.mUserState = loginState;
break;
case R.id.login_logout_btn:
MainActivity.mUserState = logoutState;
break;
}
}
};
}
/**
* 用户状态
*/
public interface UserState {
void forward(Activity context);
void saveUserInfo();
}
/**
* 登录模式
*/
public class LoginState implements UserState{
@Override
public void forward(Activity context) {
Toast.makeText(context,"登录后的分享",Toast.LENGTH_SHORT).show();
}
@Override
public void saveUserInfo() {
//数据库或者xml数据保存
}
}
/**
* 游客模式
*/
public class LogoutState implements UserState{
@Override
public void forward(Activity context) {
Toast.makeText(context,"请登录后再分享", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(context, LoginActivity.class);
context.startActivity(intent);
}
@Override
public void saveUserInfo() {
}
}
代码地址
https://github.com/zhoudakkk/zhoudakkk-design_pattern_day06.git