<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                [TOC] ## 系統 ### 自動售貨機 自動售貨機可處于 4 種不同的狀態中 * 有商品(has-Item) * 無商品(no-Item) * 商品已請求(item-Requested) * 收到紙幣(has-Money) 自動售貨機也會有不同的操作 * 選擇商品 * 添加商品 * 插入紙幣 * 提供商品 自動售貨機可以有多種不同的狀態,同時會在這些狀態之間持續不斷地互相轉換。我們假設自動售貨機處于`商品已請求`狀態中。在“插入紙幣”的操作發生后,機器將自動轉換至`收到紙幣`狀態。 根據其當前狀態,機器可就相同請求采取不同的行為。例如,如果用戶想要購買一件商品,機器將在`有商品`狀態時繼續操作,而在`無商品`狀態時拒絕操作 <details> <summary>main.go</summary> ``` // 不同的 state 分別實接口的4種情況的處理流程 package main import ( "fmt" "log" ) // 自動售貨 type vendingMachine struct { hasItem state // 有商品 itemRequested state // 商品已請求 hasMoney state // 插入紙幣 noItem state // 收到紙幣 currentState state itemCount int itemPrice int } func newVendingMachine(itemCount, itemPrice int) *vendingMachine { v := &vendingMachine{ itemCount: itemCount, itemPrice: itemPrice, } hasItemState := &hasItemState{ vendingMachine: v, } itemRequestedState := &itemRequestedState{ vendingMachine: v, } hasMoneyState := &hasMoneyState{ vendingMachine: v, } noItemState := &noItemState{ vendingMachine: v, } v.setState(hasItemState) v.hasItem = hasItemState v.itemRequested = itemRequestedState v.hasMoney = hasMoneyState v.noItem = noItemState return v } func (v *vendingMachine) requestItem() error { return v.currentState.requestItem() } func (v *vendingMachine) addItem(count int) error { return v.currentState.addItem(count) } func (v *vendingMachine) insertMoney(money int) error { return v.currentState.insertMoney(money) } func (v *vendingMachine) dispenseItem() error { return v.currentState.dispenseItem() } func (v *vendingMachine) setState(s state) { v.currentState = s } func (v *vendingMachine) incrementItemCount(count int) { fmt.Printf("Adding %d items\n", count) v.itemCount = v.itemCount + count } // 狀態接口,聲明不通狀態下的操作 type state interface { addItem(int) error // 選擇商品 requestItem() error // 添加商品 insertMoney(money int) error // 插入紙幣 dispenseItem() error // 送貨 } // 有商品 type hasItemState struct { vendingMachine *vendingMachine } func (i *hasItemState) requestItem() error { // 切換到無商品模式 if i.vendingMachine.itemCount == 0 { i.vendingMachine.setState(i.vendingMachine.noItem) return fmt.Errorf("No item present") } fmt.Printf("Item requestd\n") i.vendingMachine.setState(i.vendingMachine.itemRequested) return nil } func (i *hasItemState) addItem(count int) error { fmt.Printf("%d items added\n", count) i.vendingMachine.incrementItemCount(count) return nil } func (i *hasItemState) insertMoney(money int) error { return fmt.Errorf("請先選擇項目") } func (i *hasItemState) dispenseItem() error { return fmt.Errorf("請先選擇項目") } // 沒商品 type noItemState struct { vendingMachine *vendingMachine } func (i *noItemState) requestItem() error { return fmt.Errorf("商品缺貨") } // 添加商品,切換為有商品狀態 func (i *noItemState) addItem(count int) error { i.vendingMachine.incrementItemCount(count) i.vendingMachine.setState(i.vendingMachine.hasItem) return nil } func (i *noItemState) insertMoney(money int) error { return fmt.Errorf("商品缺貨") } func (i *noItemState) dispenseItem() error { return fmt.Errorf("商品缺貨") } // 商品已請求 type itemRequestedState struct { vendingMachine *vendingMachine } func (i *itemRequestedState) requestItem() error { return fmt.Errorf("物品已被要求") } func (i *itemRequestedState) addItem(count int) error { return fmt.Errorf("項目分配過程中") } func (i *itemRequestedState) insertMoney(money int) error { if money < i.vendingMachine.itemPrice { _ = fmt.Errorf("插入的錢更少。請插入 %d", i.vendingMachine.itemPrice) } fmt.Println("Money entered is ok") i.vendingMachine.setState(i.vendingMachine.hasMoney) return nil } func (i *itemRequestedState) dispenseItem() error { return fmt.Errorf("請先插入錢") } // 收到貨幣 type hasMoneyState struct { vendingMachine *vendingMachine } func (i *hasMoneyState) requestItem() error { return fmt.Errorf("正在進行物品分配") } func (i *hasMoneyState) addItem(count int) error { return fmt.Errorf("正在進行物品分配") } func (i *hasMoneyState) insertMoney(money int) error { return fmt.Errorf("商品缺貨") } func (i *hasMoneyState) dispenseItem() error { fmt.Println("Dispensing Item") i.vendingMachine.itemCount -- if i.vendingMachine.itemCount == 0 { i.vendingMachine.setState(i.vendingMachine.noItem) } else { i.vendingMachine.setState(i.vendingMachine.hasItem) } return nil } func main() { // 初始化商品, 數量1 ,價格10 vendingMachine := newVendingMachine(1, 10) err := vendingMachine.requestItem() if err != nil { log.Fatalf(err.Error()) } // 2020/09/30 23:21:51 請先插入錢 //err= vendingMachine.dispenseItem() //if err != nil { // log.Fatalf(err.Error()) //} err = vendingMachine.insertMoney(10) if err != nil { log.Fatalf(err.Error()) } err = vendingMachine.dispenseItem() if err != nil { log.Fatalf(err.Error()) } fmt.Println() err = vendingMachine.addItem(2) if err != nil { log.Fatalf(err.Error()) } fmt.Println() err = vendingMachine.requestItem() if err != nil { log.Fatalf(err.Error()) } err = vendingMachine.insertMoney(10) if err != nil { log.Fatalf(err.Error()) } err = vendingMachine.dispenseItem() if err != nil { log.Fatalf(err.Error()) } } ``` </details> <br /> 輸出 ``` Item requestd Money entered is ok Dispensing Item Adding 2 items Item requestd Money entered is ok Dispensing Item ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看