语言与模式-18状态模式

35 篇文章 1 订阅
24 篇文章 0 订阅

意图

允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。

适用性

  • 一个对象的行为取决于它的状态, 并且它必须在运行时刻根据状态改变它的行为。
  • 一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。这个状态通常用一个或多个枚举常量表示。通常, 有多个操作包含这一相同的条件结构。State模式将每一个条件分支放入一个独立的类中。这使得你可以根据对象自身的情况将对象的状态作为一个对象,这一对象可以不依赖于其他对象而独立变化。

Java实现

public class Order{
     private State unPayState;
     private State payedState;
     private State sendState;
     private State doneState;    //四种状态,四种类,对应的get,set方法省略

     private State state = unPayState;     //当前状态

     public Order(){
        unPayState = new UnPayState(this);
        payedState = new PayedState(this);            //传入Order对象,为了修改Order的状态
        ...
     }

     public void pay(){
          state.pay();
     }

     public void send(){
          state.send();
     }

     ....
}
//State接口
public interface State{
     public void pay();
     public void send();
     ...
}
//UnPayState
public class UnPayState implements State{

     private Order order;
     public UnPayState(Order order){
           this.order = order;
     }

     public void pay(){
         //pay money
         order.setState(order.getPayedState());
     }

     public void send(){
         //exception: can't send
     }
     .....
}

//其他实现略

Clojure实现

Clojure模拟实现!

(def order (atom {:status :unPay}))

(defmulti invoke (fn [ord] (:status @ord)))

(defmethod invoke
  :unPay
  [ord]
  (println "UnPay")
  (swap! order assoc :status :send))

(defmethod invoke
  :send
  [ord]
  (println "Send")
  (swap! order assoc :status :unPay))

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值