设计模式学习(八)----状态

状态模式:

        状态与策略是十分相近的模式,只是"意向"不同。

 

现在的自动贩卖机,如何设计:

首先我们可以看到自动贩卖机的几个状态:

1. 没有钱

2. 加入钱

3.选择

4 出货

5 无货

 

1——>2: action: put money

2——>3: pick

3——>4: drink out

if(count > 0) 4——>1

else 4——>5

 

public class machine {

    public void insertMoney();

    public void pick();

    public void out();

}

 

如果不使用模式,最直接的方法会是,使用if/else 判断来根据machine处于的不同状态,来进行操作

比如,在1时,pick是没用的...

 

但是就用前面讲到过的策略模式一样,我们要做的就是封装变化

这里什么是变化的? 明显:state

将操作抽象到接口或抽象类State

然后不同的状态实现或继承State

如:

   public class NoMoney extends state{

      private Machine machine;

    public void setXX()....

    public void insertMoney(){

         machine.setState(machine.getMoneyInState());

    }

}

NoMoney是1 状态

只有insertMoney对它是有用的,其他的方法可以在State中有默认的实现(这种处理方法已经用到了多次)

它完成了状态的转换

 

当然这些状态的转换,可以放在状态类中,也可以放在machine中,区别是,放在状态类中的话,状态类之间就耦合了

这是十分不好的,因此我认为状态的转换还是放在machine中好:

public class Machine {

     public  state NoMoney;

    public State MoneyIn;

     ....

   public State state;

   public void insertMoney(){

       state.insertMoney(); //这里state是NoMoney

      state = moneyIn;  // 转换

}

}

 

而且,这样一旦添加了新的状态,我们一般不需要去改已存在状态的逻辑,而可以去修改machine,因为状态之间的逻辑

是放在machine中的,这样比较有弹性,对修改关闭,对扩展开放

 

现在来看看,策略和状态的区别:

从形式上,甚至类图上,两者没有明显的区别,可以说是一样的。

两者的不同是在思想上,策略模式,是主动的动态修改实体的行为,主动选择行为,

状态模式不同,状态的改变,导致了行为的不同,不能主动修改行为,只能根据状态来执行,可以说行为的顺序,或者说行为模式已经定死了

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值