使用 策略模式 控制用户的登录与否的行为
来源:互联网 发布:淘宝助理教程 编辑:程序博客网 时间: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
- 使用 策略模式 控制用户的登录与否的行为
- 行为型的设计模式-策略模式
- 控制用户登录的时间
- Gamification:使用游戏策略影响用户行为的入门介绍(1)
- Spring-----------------Singleton的使用与否
- osg控制节点的显示与否
- 策略模式的使用
- 策略模式的使用
- ASP.NET 控制用户的登录
- 行为型模式-观察者模式的使用
- 行为模式-策略模式
- 行为模式-策略模式
- 策略模式 - 行为模式
- 行为模式->策略模式
- 通达OA中 关于msql使用存储过程控制执行的总体成功与否
- 用户行为的长尾
- 用户行为的收集
- 策略模式的演化使用
- GitHub机器学习项目,你了解多少?
- POJ 3009 Curling 2.0 (dfs)
- 链式队列的实现
- 十进制的转换
- StringUtils的isBlank与isEmply详解
- 使用 策略模式 控制用户的登录与否的行为
- 互斥锁和自旋锁
- win8.1系统安装密钥序列号
- Chrome无法打开文件的错误 [Not allowed to load local resource: file://XXXX]
- Activity原理
- CentOS下安装memcached
- a value of type "const struct Menu * "cannot be assigned to an entity of type "struct Menu"
- 设计模式系列(六)——桥接模式
- Android之SharedPreferences读写数据