您的位置:首页 > 其它

使用 策略模式 控制用户的登录与否的行为

2016-03-25 18:55 387 查看

使用 策略模式 控制用户的登录与否的行为

策略模式

根据用户的状态,在同一个事件作出不同的相应

如下图 ,当用户已经登录的话,我们点击 转发 就进行转发,否则就跳转到登录界面 (当然是用简单的ifelse也可以,但是当代码非常庞大的时候,我们的程序会很脆弱)



下面是我们的UML图



在MainActivity中点击转发,评论的时候,根据不同的状态,进行不同的策略

策略接口

`public interface UserState {
public void forward(Context ctx);
public void comment(Context ctx);
}`


LoginState 实现类接口

`public class LoginState implements UserState{

@Override
public void forward(Context ctx) {
ToastUtils.toastShort(ctx, "转发成功");
}

@Override
public void comment(Context ctx) {
ToastUtils.toastShort(ctx, "评论成功");

}

}`


LogoutState接口实现类

`public class LogoutState implements UserState{

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

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

}
`


LoginContext 通过注入不同的状态,相应不同的事件

之所以通过单例模式,设置LoginContext的原因,是因为里面的状态会被多个组件共享

`public class LoginContext {
private static  LoginContext loginContext;
private UserState state=new LogoutState();
private LoginContext(){

}
public static LoginContext getContext(){
//双重检测
if(loginContext==null){
synchronized (LoginActivity.class) {
if(loginContext==null)
loginContext=new LoginContext();
}
}
return loginContext;
}
public void setState(UserState state){
this.state=state;
}
public void forward(Context ctx){
state.forward(ctx);
}
public void comment(Context ctx){
state.comment(ctx);
}
}


`

在loginActivty中对登录状态进行修改

`public class LoginActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
}
public void login(View v){
ToastUtils.toastShort(this, "登录成功");
//设置状态
LoginContext.getContext().setState(new LoginState());
finish();
}
}


`

之后再MainActivity中直接拿到LoginContext中的对象,跳转即可。这样就可以根据用户是否已经登录,自动的实现功能了

MainActivity代码

`public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void forward(View v){
LoginContext.getContext().forward(this);
}
public void comment(View v){
LoginContext.getContext().comment(this);

}

}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
//通过pid 杀死进程 因为LoginContext是static,因此程序退出的时候,杀死进程,否则状态一则存在
android.os.Process.killProcess(android.os.Process.myUid());
System.exit(0);//退出虚拟机
}


`

总结

策略模式,根据用户不同的状态自动的实现了相关跳转,比起if else,程序健壮了许多

单利模式,当对象里面的内容被共享的时候,一般设计成单利模式,这样的话,对象的状态也就统一起来
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: