设计模式之状态模式

骑猪看日落 2024-04-03 10:09 145阅读 0赞

什么是设计模式
设计模式是经常使用、大多数人知道,有特定目录的代码设计经验。设计模式可以提高代码可维护性,可提升代码运行效率,也能提高系统可靠性。设计模式可以分为三类,分别是创建型、结构型和行为型。以下就状态模式简要概述。

什么是状态模式
状态模式就是类的行为基于其状态变化而改变,属于行为型模式。

应用场景
1、大量与对象状态判断的业务的场景

优势与劣势
优点:
1、将对象状态判断抽象出来代码灵活性提高,增加或者删除状态不影响其他代码
2、上下文不参与具体判断逻辑由抽象实现类自动进行行为转换

缺点:
1、每个对象状态都需要实现抽象类,增加代码复杂性与可读性
2、影响开闭原则

小试牛刀

  • 对象的行为由状态改变而改变
  • 商机出售货物有很多,每种商品都能够获得积分
  • 在购物达到指定标准的时候,顾客可以获取其他的一些特权,比如我们例子中的赠送物品
  • 这个就是典型的对象的行为根据对象的状态改变而变化

类的依赖关系为:
在这里插入图片描述

1、创建一个商店并声明积分状态integral

  1. /**
  2. * 商店
  3. * @author senfel
  4. * @version 1.0
  5. * @date 2022/10/8 10:26
  6. */
  7. public class Store {
  8. /**
  9. * 购物积分
  10. */
  11. private BigDecimal integral;
  12. /**
  13. * 购物属性
  14. */
  15. private Shopping shopping;
  16. public Shopping getShopping() {
  17. return shopping;
  18. }
  19. public void setShopping(Shopping shopping) {
  20. this.shopping = shopping;
  21. }
  22. public BigDecimal getIntegral() {
  23. return integral;
  24. }
  25. public void setIntegral(BigDecimal integral) {
  26. this.integral = integral;
  27. }
  28. /**
  29. * 售出的物品
  30. * 由于购物积分改变使得顾客可以获得其他附属产品
  31. * 如果购物积分大于20 赠送香蕉二斤
  32. * 如果购物积分大于100 赠送芒果二斤
  33. * 这个就是改变状态影响行为的例子
  34. *
  35. */
  36. public void buySomething(){
  37. System.err.println("商店售出物品:"+shopping.getDesc());
  38. if(integral.compareTo(new BigDecimal("100")) >= 0){
  39. System.err.println("额外赠送芒果二斤");
  40. }else if(integral.compareTo(new BigDecimal("20")) >= 0){
  41. System.err.println("额外赠送香蕉二斤");
  42. }else{
  43. System.err.println("购物积分不足,无赠送福利");
  44. }
  45. }
  46. }

2、创建购物抽象,增加顾客购物修改商店状态抽象方法

  1. /**
  2. * 购物抽象
  3. * @author senfel
  4. * @version 1.0
  5. * @date 2022/10/8 10:27
  6. */
  7. public abstract class Shopping {
  8. /**
  9. * 购物备注
  10. */
  11. private String desc;
  12. /**
  13. * 购物抽象方法
  14. */
  15. abstract void buy(Store store);
  16. public String getDesc() {
  17. return desc;
  18. }
  19. public void setDesc(String desc) {
  20. this.desc = desc;
  21. }
  22. }

3、增加两个实体购物类

  1. /**
  2. * 购买衣服
  3. * @author senfel
  4. * @version 1.0
  5. * @date 2022/10/8 10:29
  6. */
  7. public class BuyCloth extends Shopping{
  8. @Override
  9. public void buy(Store store) {
  10. System.err.println("顾客购买衣服一套");
  11. if(Objects.isNull(store.getIntegral())){
  12. store.setIntegral(BigDecimal.ZERO);
  13. }
  14. store.setIntegral(store.getIntegral().add(new BigDecimal("20")));
  15. this.setDesc("衣服一套");
  16. store.setShopping(this);
  17. }
  18. }
  19. /**
  20. * 购买水果
  21. * @author senfel
  22. * @version 1.0
  23. * @date 2022/10/8 10:29
  24. */
  25. public class BuyFruit extends Shopping{
  26. @Override
  27. public void buy(Store store) {
  28. System.err.println("顾客购买水果一斤");
  29. if(Objects.isNull(store.getIntegral())){
  30. store.setIntegral(BigDecimal.ZERO);
  31. }
  32. store.setIntegral(store.getIntegral().add(new BigDecimal("5")));
  33. this.setDesc("水果一斤");
  34. store.setShopping(this);
  35. }
  36. }

4、测试状态模式,顾客购买物品修改商店状态,商店根据修改的状态实现具体的卖货行为。

  1. /**
  2. * 状态模式测试
  3. * @author senfel
  4. * @version 1.0
  5. * @date 2022/10/8 10:39
  6. */
  7. @SpringBootTest
  8. public class TestStatePattern {
  9. /**
  10. * 对象的行为由状态改变而改变
  11. * 商机出售货物有很多,每种商品都能够获得积分
  12. * 在购物达到指定标准的时候,顾客可以获取其他的一些特权,比如我们例子中的赠送物品
  13. * 这个就是典型的对象的行为根据对象的状态改变而变化
  14. */
  15. @Test
  16. public void test(){
  17. //创建一个商店
  18. Store store = new Store();
  19. //客户购买水果,购买会改变商店的积分状态
  20. BuyFruit buyFruit = new BuyFruit();
  21. buyFruit.buy(store);
  22. System.err.println("当前积分:"+store.getIntegral());
  23. //商店的行为根据状态改变而改变
  24. store.buySomething();
  25. //客户购买衣服,购买会改变商店的积分状态
  26. BuyCloth buyCloth = new BuyCloth();
  27. buyCloth.buy(store);
  28. System.err.println("当前积分:"+store.getIntegral());
  29. //商店的行为根据积分状态改变而改变
  30. store.buySomething();
  31. }
  32. }

5、测试结果:

顾客购买水果一斤
当前积分:5
商店售出物品:水果一斤
购物积分不足,无赠送福利
顾客购买衣服一套
当前积分:25
商店售出物品:衣服一套
额外赠送香蕉二斤

发表评论

表情:
评论列表 (有 0 条评论,145人围观)

还没有评论,来说两句吧...

相关阅读

    相关 设计模式状态模式

    什么是设计模式 设计模式是经常使用、大多数人知道,有特定目录的代码设计经验。设计模式可以提高代码可维护性,可提升代码运行效率,也能提高系统可靠性。设计模式可以分为三类,分别

    相关 设计模式状态模式

    一.什么是状态模式? 状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了这个类. 二.什么时候使用状态模式? 状态模式主要解决的是当控制

    相关 设计模式状态模式

    在软件开发过程中,应用程序中的部分对象可能会根据不同的情况作出不同的行为,我们把这种对象称为有状态的对象,而把影响对象行为的一个或多个动态变化的属性称为状态。 状态模式:对有

    相关 设计模式状态模式

    状态模式定义:当一个对象内在状态改变时允许其改变行为,这个对象看起来像改变了其类。 优点: 1、结构清晰,避免使用过多的switch……case或者if……else语句,避

    相关 设计模式状态模式

    定义:又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为模式。状态模式允许一个对象在其内部状态改变的时候改变其行为。这个对象看

    相关 设计模式状态模式

    . 模式定义 ​ 在很多情况下,一个对象的行为取决于它的一个或多个变化的属性,这些属性我们称之为状态,这个对象称之为状态对象。对于状态对象而已,它的行为依赖于它的状态,