使用 策略模式 控制用户的登录与否的行为
- 策略模式
- 根据用户的状态,在同一个事件作出不同的相应
- 如下图 ,当用户已经登录的话,我们点击 转发 就进行转发,否则就跳转到登录界面 (当然是用简单的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,程序健壮了许多
- 单利模式,当对象里面的内容被共享的时候,一般设计成单利模式,这样的话,对象的状态也就统一起来