设计模式 -- 状态模式

85 阅读2分钟

「这是我参与11月更文挑战的第10天,活动详情查看:2021最后一次更文挑战

含义: 允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。这是说的啥,好像又模糊了,对象的行为跟随状态的改变而改变,好像对象重新初始化了一个类。就是将代码中与对象有关的内容抽象出来。

拿无人超市举例子吧

 public class SelfServiceSupermarket
 {
     //扫码
     private final static int CODE = 0;
     //未扫码
     private final static int NO_CODE = 0;
     //售出商品
     private final static int SOLD = 1;
     //无商品
     private final static int SELLOUT = 2;
  
     private int commodityStatus = NO_CODE;
     
     //数量
     private int count = 0;
  
     public SelfServiceSupermarket(int count)
     {
         this.count = count;
         if (count > 0)
         {
             commodityStatus = NO_MONEY;
         }
     }
  
     /**
      * 投入硬币,任何状态用户都可能投币
      */
     public void insertMoney()
     {
         switch (commodityStatus)
         {
         case NO_CODE:
             commodityStatus = CODE;
             System.out.println("成功扫码");
             break;
         case CODE:
             System.out.println("已经扫过码");
             break;
         case SOLD:
             System.out.println("请稍等...");
             break;
         case SELLOUT:
             System.out.println("此商品已经下架,请勿购买");
             break;
  
         }
     }
  
     //支付
     public void pay()
     {
         switch (commodityStatus)
         {
         case NO_CODE:
             System.out.println("无商品");
             break;
         case CODE:
             System.out.println("支付成功");
             commodityStatus = SOLD;
             dispense();
             break;
         case SOLD:
             System.out.println("已经支付");
             break;
         case SOLD_OUT:
             System.out.println("此商品已经下架,请勿购买");
             break;
  
         }
     }

主要是为了解决依赖于对象的状态(属性)的行为,并且能够根据自身行为状态的改变,从而改变它的相关行为。

优点: 1、封装了转换规则。 2、将与某个状态有关的所有行为集中在一个类中,并能够很方便的添加状态。3、允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块。 5、能够让不同的对象共同使用同一个状态对象,可以减少对象的个数。

缺点: 1、状态模式的结构与实现都非常的复杂,使用时要特别注意,不然会使代码变得非常混乱,不易维护。 3、不是很满足“开闭原则”。