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

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

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值