日常开发中,登录和未登录两种状态分别有不同的操作,比如登录后才能评论、收藏、支付购买和编辑资料等操作。我们网购时看到心仪的商品,如果处于登录状态,可以加购物车或直接购买,否则会跳转到登录页面,登录后再继续执行先前的动作。这里涉及的状态有两种,即登录和未登录。行为有两种,即加购物车和直接购买。

如果使用 if-else 语句实现,代码如下。

public void addShopping() {

if(未登录){

System.out.println("去登录");

return;

}

System.out.println("加入购物车!");

}

public void buy(){

if(未登录){

System.out.println("去登录");

return;

}

System.out.println("直接购买!");

}

以上代码是比较常用的,可以看出每个操作都需要判断用户是否处于登录状态。简单的情况下这样做没什么问题,也省去了状态类,但是如果这是一个庞大的系统。那就有必要斟酌是否使用状态模式了。

下面使用状态模式来实现这个逻辑,代码如下。

首先创建抽象状态角色 UserState 类,用来定义不同状态下需要执行的方法。

public abstract class UserState {

public AppContext getContext() {

return context;

}

protected AppContext context;

public void setContext(AppContext context) {

this.context = context;

}

public abstract void addShopping();

public abstract void buy(String buy);

}

然后创建登录状态 LoginState 类。

package state;

public class LoginState extends UserState {

@Override

public void addShopping() {

System.out.println("加购物车成功");

}

@Override

public void buy(String buy) {

System.out.println(buy);

}

}

创建未登录状态 UnLoginState 类。

package state;

public class UnLoginState extends UserState {

@Override

public void addShopping() {

this.jumpLogin();

this.context.getState().addShopping();

}

@Override

public void buy(String buy) {

this.jumpLogin();

this.context.getState().buy(buy);

}

private void jumpLogin() {

System.out.println("跳转到登录页面!");

this.context.setState(this.context.STATE_LOGIN);

}

}

创建上下文角色 AppContext 类,此类负责操作状态,并且实现了调用类需要用到的方法。

package state;

public class AppContext {

public static final UserState STATE_LOGIN = new LoginState();

public static final UserState STATE_UNLOGIN = new UnLoginState();

private UserState currentState = STATE_UNLOGIN;

{

STATE_LOGIN.setContext(this);

STATE_UNLOGIN.setContext(this);

}

public void setState(UserState state) {

this.currentState = state;

}

public UserState getState() {

return this.currentState;

}

public void addShopping() {

this.currentState.addShopping();

}

public void buy(String buy) {

this.currentState.buy(buy);

}

}

最后编写客户端测试代码如下。

public class Test {

public static void main(String[] args) {

AppContext context = new AppContext();

context.addShopping();

context.buy("直接购买");

}

}

运行结果如下所示。

跳转到登录页面!

加购物车成功

直接购买

python 状态模式_使用状态模式自由切换登录状态相关推荐

  1. python教学研究_基于CDIO模式的Python教学研究

    摘 要:Python语言是近几年发展迅猛的计算机语言,但在国内市场较小,中文资料匮乏,实用案例较少,教学难度大.本文首先阐述Python语言的特点和CDIO工程教育模式的概念及理念,然后分析目前教学模 ...

  2. python的盈利模式_八大盈利模式是什么?一篇文教会你盈利模式分析!

    当今如果说到创业,永远绕不开一个话题:"模式". 非创业者往往最关注的是"产品"或"服务": 初级创业者往往最关注的的是"行业&q ...

  3. java 状态设计模式_实例讲解:Java中的状态设计模式

    Java中的状态设计模式是一种软件设计模式,当对象的内部状态更改时,该模式允许对象更改其行为.状态设计模式通常用于以下情况:对象取决于其状态,并且在运行期间必须根据其内部状态更改其行为.状态设计模式是 ...

  4. 工程模式和抽象工厂模式_功能工厂模式

    工程模式和抽象工厂模式 您是否需要一种非常快速的方法来制作Factory对象? 然后,您需要lambda或其他函数传递! 它不仅快速,而且非常简单. 我敢打赌,如果您对Lambdas相当满意,那么您只 ...

  5. 我的世界java旁观者模式_我的世界如何切换到旁观模式

    我的世界中如何切换到旁观模式 本篇教程将用图文的形式一步步教会你在我的世界中如何切换到旁观模式. 旁观模式只出现在我的世界PC/Mac版本中,它首次出现在我的世界PC/Mac  1.8版本中,允许玩家 ...

  6. 工厂方法模式_工厂方法模式

    工厂方法模式是简单工厂模式的升级版,简单工厂模式不符合设计模式的原则(即:单一职责,开闭原则) 优点: 职责明确,扩展方便 缺点:需要创建多个工厂 实现步骤: 1.将工厂通用方法抽取接口 (例如:IF ...

  7. 哈斯机床进去debug模式_责任链模式

    原文链接: 责任链模式 | 菜鸟教程​www.runoob.com 顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这种模式给予请 ...

  8. shell开启飞行模式_手机飞行模式有什么用 手机飞行模式介绍【详解】

    手机飞行模式功能一直被大家吐槽为最没有用的手机功能,随着智能手机的快速发展,手机很多功能都已经逐渐消失被替代,唯独飞行模式依旧占据着手机设置里的主要地位. 那么问题来了,手机飞行模式到底有什么用? 1 ...

  9. 代理模式 委派模式 策略模式_设计模式 - 委派模式

    理解 首先委派模式不属于23种设计模式. 所谓委派,个人理解是:将为达到最终结果的事情交给其他人或中间人来干,我只要最终结果,其他的事情,由我委派的人来安排. 更直白的表达就是,比如,我们想要盖一栋楼 ...

最新文章

  1. java自定义监听器例子_Spring 实现自定义监听器案例
  2. Codeforces Gym 100650B Countdown (离线)
  3. python基础题面试_python常见面试题
  4. leetcode 853. Car Fleet | 853. 车队(Golang)
  5. LinuxWindows下批量修改文件后缀
  6. 求一个正整数是哪几个正整数相加的和,这些数不能相同
  7. Windows 帐号管理相关操作
  8. leetcode python3 简单题168. Excel Sheet Column Title
  9. UVA11398 The Base-1 Number System【进制】
  10. 通力法评 | 《证券基金经营机构信息技术管理办法》解读
  11. c++数据格式化输出/字符串复制/字符串比较
  12. 计算圆柱的侧面积及体积
  13. 新更新....llq原创考试第二题
  14. 来把三子棋吗?创建属于你的三子棋。
  15. 如何打开.pt文件?
  16. 连接问题:ORA-3136:inbound connection timed out
  17. 网络设备的两个结构体net_device和in_device
  18. 【Python自学笔记】Python基础知识
  19. 档案数字资源长期保存的“长期”是多少年?
  20. 关于华为网络设备远程连接的详情配置 —— SSH、Telnet

热门文章

  1. 绝对定位的div的居中方法,下面的写法兼容IE系列浏览器和火狐浏览器。
  2. Java技巧:提高J2SE性能的代码技巧
  3. 用jQuery和css3实现的一个模仿淘宝ued博客左边的菜单切换动画效果
  4. URI、URL和URN的关系
  5. 入门机器学习(八)--神经网络参数的反向传播算法
  6. Dart 5-Day
  7. Modularity(模块化-UMD通用模式)
  8. Asynchronous(异步处理)
  9. 蓝桥杯基础练习之杨辉三角
  10. 计算机视觉专业要学什么课程,[08本]“计算机视觉基础”课程介绍和课件