今天写代码,发现项目中好几处的地方都是处处充斥的if(){}else的这样的代码,他们实现的功能都是一样的,都是如果登录了的话就跳到特定的页面,如果没登录的话就跳转到登录界面,看到如此多的重复if(){}else,我的内心是抗拒的,然后想着怎么去优化它。可不可以不用if(){}else呢,答案是肯定的,由此我翻阅一些资料,然后发现有种设计模式很符合这种需求,也就是今天我要分享的这种模式,状态模式,状态模式的主要作用就是对于同一个事件可以处理不同的结果的一种优雅模式,好了不多说了,咱们还是码一个简单的事例还帮助我们理解吧~~
下面就用状态模式简单的实现这个过程,如果登录了就跳转特定的页面否则就跳到登录页面:
首先项目中肯定包含3个Activity,一个主页,一个登录页和一个需要跳转的那个特定页面,首页我们就简单定义两个button,一个跳转按钮和一个注销按钮吧,LoginActivity则为登录页。用户的默认状态为未登录状态,然后在登录页成功后返回主页,用户在进行跳转就能跳到特定页了,
MainActivity代码如下:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//跳转到特定页面
findViewById(R.id.tz).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
LoginContest.getLoginContest().forward(MainActivity.this);
}
});
//注销,退出登录
findViewById(R.id.zx).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
LoginContest.getLoginContest().setUserState(new LogoutState());
}
});
}
}
LoginActivity则是在用户点击登录后,然后将状态设置为已登录的状态并返回MainActivity:代码如下:
/**
* Created by liwenjie on 2016/10/19 15:06
*/
public class LoginActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login_layout);
findViewById(R.id.login_btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
toLogin();
finish();
}
});
}
//此处是直接模拟登录成功后将状态设为成功
void toLogin(){
LoginContest.getLoginContest().setUserState(new LoginedState());
}
}
接下来就是我们最主要的类了,他就是用户操作对象和状态管理对象,LoginContext,这个类将相关操作委托个状态对象,这样在状态发生变化时,LoginContext的行为就会改变:代码如下:
/**
* Created by liwenjie on 2016/10/19 15:09
*/
public class LoginContest {
/*用户接口和状态管理类*/
/*默认未登录*/
UserState userState = new LogoutState();
static LoginContest loginContest = new LoginContest();
private LoginContest(){}
public static LoginContest getLoginContest(){
return loginContest;
}
public void setUserState(UserState userState){
this.userState = userState;
}
//跳转页面
public void forward(Context context){
userState.forward(context);
}
}
上面是管理类,但LoginContest 是通过设置状态来改变的,并将操作委托给状态对象,不同的状态对象对同一个操作进行不同的处理。我们写一个状态操作接口:代码如下
/**
* Created by liwenjie on 2016/10/19 15:10
* 用户状态
*/
public interface UserState {
/*转发*/
public void forward(Context context);
}
然后状态对象好了,我们用两个不同状态对象分别实现它然后实现同一对象操作有不同状态:一个为登录的状态,和未登录状态:
登录状态:
/**
* Created by liwenjie on 2016/10/19 15:18
*/
public class LoginedState implements UserState {
/*已登录的状态*/
@Override
public void forward(Context context) {
//处理跳转到你特定的页面
}
}
未登录状态
/**
* Created by liwenjie on 2016/10/19 15:18
*/
public class LogoutState implements UserState {
/*未登录的状态*/
@Override
public void forward(Context context) {
gotoLoginActivity(context);
}
//未登录的时候统一跳到登录页
private void gotoLoginActivity(Context context) {
Intent intent = new Intent(context, LoginActivity.class);
context.startActivity(intent);
}
}
OK整体的模式差不多就介绍到这了,小弟才疏学浅,如果有错误或者啥的望海涵,欢迎一起学习讨论~~~~