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

来源:互联网 发布:淘宝助理教程 编辑:程序博客网 时间:2024/06/15 05:32

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

  • 策略模式
    • 根据用户的状态,在同一个事件作出不同的相应
  • 如下图 ,当用户已经登录的话,我们点击 转发 就进行转发,否则就跳转到登录界面 (当然是用简单的ifelse也可以,但是当代码非常庞大的时候,我们的程序会很脆弱)

  • 下面是我们的UML图

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

    `public interface UserState { public void forward(Context ctx); public void comment(Context ctx);}`
  • LoginState 实现类接口

    `public class LoginState implements UserState{@Overridepublic void forward(Context ctx) {ToastUtils.toastShort(ctx, "转发成功");}@Overridepublic void comment(Context ctx) {ToastUtils.toastShort(ctx, "评论成功");}}`
  • LogoutState接口实现类

    `public class LogoutState implements UserState{@Overridepublic void forward(Context ctx) {gotoLoginActivity( ctx);}@Overridepublic 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{@Overrideprotected 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 {@Overrideprotected 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);}}@Overrideprotected void onDestroy() {// TODO Auto-generated method stubsuper.onDestroy();//通过pid 杀死进程 因为LoginContext是static,因此程序退出的时候,杀死进程,否则状态一则存在android.os.Process.killProcess(android.os.Process.myUid());System.exit(0);//退出虚拟机}

    `

总结

  • 策略模式,根据用户不同的状态自动的实现了相关跳转,比起if else,程序健壮了许多
  • 单利模式,当对象里面的内容被共享的时候,一般设计成单利模式,这样的话,对象的状态也就统一起来
0 0
原创粉丝点击