使用 策略模式 控制用户的登录与否的行为
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,程序健壮了许多单利模式,当对象里面的内容被共享的时候,一般设计成单利模式,这样的话,对象的状态也就统一起来
相关文章推荐
- 递归
- GitHub机器学习项目,你了解多少?
- GitHub深度学习项目,你了解多少?
- 网络流入门—用于最大流的Dinic算法
- 最简单的二进制神经网络
- Git命令使用个人总结
- TOP排行新闻列表。
- 纠正对Fragment Transaction BackStack的误解
- mybatis中mapping文件like查询方式
- Java Learning:并发中的同步锁(synchronized)
- 求整数组里最大子数组的和
- 简单的logback日志收集服务端
- 找到⼀个未知长度单链表的倒数第K个节点
- Struts2 - 常用的constant总结
- 机器学习基础(二十三)—— 概念、定义
- js 里 写两个日期的相差时间
- android学习之intent跳转3引用值得传递
- 【Linux】ubuntu apt-get apt-cache命令 使用
- git pull vs fetch/rebase/merge
- 【运算符优先级问题(持续更新...)】