国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【設(shè)計(jì)模式】訂單狀態(tài)流傳中的狀態(tài)機(jī)與狀態(tài)模式

這篇具有很好參考價(jià)值的文章主要介紹了【設(shè)計(jì)模式】訂單狀態(tài)流傳中的狀態(tài)機(jī)與狀態(tài)模式。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

1. 前言

狀態(tài)模式一般是用在對(duì)象內(nèi)部的狀態(tài)流轉(zhuǎn)場(chǎng)景中,用來實(shí)現(xiàn)狀態(tài)機(jī)。

什么是狀態(tài)機(jī)呢?
狀態(tài)機(jī)是對(duì)狀態(tài)轉(zhuǎn)移的抽象,由事件狀態(tài)、動(dòng)作組成,事件有時(shí)候也被稱為轉(zhuǎn)移事件或者轉(zhuǎn)移,當(dāng)事件觸發(fā)時(shí),可以將狀態(tài)由一個(gè)狀態(tài)變更為另一個(gè)狀態(tài),并執(zhí)行動(dòng)作。其中,事件和狀態(tài)是必須存在的,動(dòng)作可以不要。

下面是一張狀態(tài)圖,表達(dá)的就是一個(gè)狀態(tài)機(jī)的模型。
【設(shè)計(jì)模式】訂單狀態(tài)流傳中的狀態(tài)機(jī)與狀態(tài)模式,# 設(shè)計(jì)模式,架構(gòu)與設(shè)計(jì),設(shè)計(jì)模式,狀態(tài)模式,軟件工程
通俗來講,就是對(duì)狀態(tài)的變更做了一定的限制,不能隨意的修改狀態(tài),而是只有處于某個(gè)特定的狀態(tài)時(shí),才能變更到另一個(gè)特定的狀態(tài)。

2.狀態(tài)模式

狀態(tài)模式將狀態(tài)抽象成一個(gè)個(gè)的狀態(tài)對(duì)象,狀態(tài)機(jī)當(dāng)前持有某個(gè)狀態(tài)對(duì)象,就表示當(dāng)前的狀態(tài)機(jī)處于什么狀態(tài)。
然后將事件處理為一個(gè)個(gè)的方法,每個(gè)方法中會(huì)操作狀態(tài)機(jī)修改狀態(tài),有需要的情況下,在修改狀態(tài)的同時(shí)還可以執(zhí)行某些動(dòng)作。

把通用部分提取出來后,可以得到這樣一個(gè)通用類圖:
【設(shè)計(jì)模式】訂單狀態(tài)流傳中的狀態(tài)機(jī)與狀態(tài)模式,# 設(shè)計(jì)模式,架構(gòu)與設(shè)計(jì),設(shè)計(jì)模式,狀態(tài)模式,軟件工程

可以看到上面的StateMachineState關(guān)系是雙向的,這是因?yàn)?strong>狀態(tài)機(jī)需要持有狀態(tài)對(duì)象來表示當(dāng)前狀態(tài),以及通過當(dāng)前的狀態(tài)對(duì)象中的方法進(jìn)行狀態(tài)的流轉(zhuǎn),而流轉(zhuǎn)的結(jié)果需要重新set到狀態(tài)機(jī)中,又要求State必須持有狀態(tài)機(jī)對(duì)象。
當(dāng)然,這里State對(duì)StateMachine的關(guān)系也可以通過依賴來表示。

2.1.訂單狀態(tài)流轉(zhuǎn)案例

假設(shè)現(xiàn)在有一個(gè)商品訂單的狀態(tài)流轉(zhuǎn)需求,狀態(tài)圖如下:
【設(shè)計(jì)模式】訂單狀態(tài)流傳中的狀態(tài)機(jī)與狀態(tài)模式,# 設(shè)計(jì)模式,架構(gòu)與設(shè)計(jì),設(shè)計(jì)模式,狀態(tài)模式,軟件工程
這里沒有加退款的狀態(tài),后續(xù)的拓展例子上會(huì)加上,用這種方式來體驗(yàn)狀態(tài)模式的拓展性。

我們拿著這個(gè)圖的時(shí)候,可以簡(jiǎn)單的在腦海里面過一遍如果通過if/else或者switch來做,應(yīng)該要怎么寫,后續(xù)如果想把退款的狀態(tài)加入進(jìn)去又該怎么拓展,這種方式應(yīng)該大家都會(huì),就不在這里贅述了。

接下來,就一步步的通過狀態(tài)模式來實(shí)現(xiàn)這么一個(gè)狀態(tài)機(jī)。

2.1.1.狀態(tài)枚舉定義

定義狀態(tài)枚舉主要是為了統(tǒng)一狀態(tài)常量,因?yàn)橛唵问切枰鋷斓模覀冊(cè)诔志没綌?shù)據(jù)庫時(shí),不能把狀態(tài)對(duì)象保存進(jìn)去,所以會(huì)涉及到狀態(tài)常量與狀態(tài)對(duì)象的互相轉(zhuǎn)換。定義的枚舉如下:

import lombok.Getter;

@Getter
public enum OrderStateEnum {
    WAIT_PAYMENT(1, "待支付"),
    WAIT_DELIVER(2, "待發(fā)貨"),
    WAIT_RECEIVE(3, "待收貨"),
    RECEIVED(4, "已收貨"),
    CANCEL(5, "已取消");

    private final int state;
    private final String desc;

    OrderStateEnum(int state, String desc) {
        this.state = state;
        this.desc = desc;
    }

    public int getState() {
        return state;
    }

    public String getDesc() {
        return desc;
    }
}

2.1.2.狀態(tài)接口與實(shí)現(xiàn)

先上代碼:

public interface OrderState {

    OrderStateEnum orderStateType();
    
    default void pay(OrderStateMachine stateMachine) {
        System.out.println("|--當(dāng)前訂單狀態(tài)不支持支付,已忽略");
    }
    default void cancel(OrderStateMachine stateMachine) {
        System.out.println("|--當(dāng)前訂單狀態(tài)不支持取消,已忽略");
    }
    default void deliver(OrderStateMachine stateMachine) {
        System.out.println("|--當(dāng)前訂單狀態(tài)不支持發(fā)貨,已忽略");
    }
    default void receive(OrderStateMachine stateMachine) {
        System.out.println("|--當(dāng)前訂單狀態(tài)不支持收貨,已忽略");
    }
}

接口中定義的pay,cancel等方法就是事件,供子類進(jìn)行實(shí)現(xiàn),相信大家也發(fā)現(xiàn)了,這些事件沒有定義成抽象方法,而是通過default定義成了一個(gè)實(shí)例方法。不太清楚為什么的同學(xué),可以先思考一下為什么要這么定義。

其實(shí)這么定義的好處是各個(gè)狀態(tài)子類只需要實(shí)現(xiàn)自己需要的方法,而不用把所有的方法都實(shí)現(xiàn)一遍,這種做法在Spring中也比較常見,在JDK8之前通常是用xxxWrapper來實(shí)現(xiàn)的,JDK8之后就重構(gòu)為直接使用default方法來實(shí)現(xiàn)了。

舉個(gè)例子:后續(xù)如果需要加入退款狀態(tài),接口中也會(huì)新增一個(gè)提交退款的事件,在各個(gè)子類中,選擇需要實(shí)現(xiàn)提交退款事件的狀態(tài)子類進(jìn)行重寫即可,而不需要所有的子類都重寫。


有多少個(gè)狀態(tài),就有多少個(gè)實(shí)現(xiàn)類,并按照上面的狀態(tài)圖,在對(duì)應(yīng)的狀態(tài)中實(shí)現(xiàn)自己需要的事件。

  • 待支付狀態(tài):有支付和取消兩種事件
    public class WaitPaymentState implements OrderState {
    
        @Override
        public OrderStateEnum orderStateType() {
            return OrderStateEnum.WAIT_PAYMENT;
        }
    
        @Override
        public void pay(OrderStateMachine stateMachine) {
            stateMachine.setCurrentState(new WaitDeliverState());
        }
    
        @Override
        public void cancel(OrderStateMachine stateMachine) {
            stateMachine.setCurrentState(new CancelState());
        }
    }
    
  • 待發(fā)貨狀態(tài):有發(fā)貨事件
    public class WaitDeliverState implements OrderState {
    
        @Override
        public OrderStateEnum orderStateType() {
            return OrderStateEnum.WAIT_DELIVER;
        }
    
        @Override
        public void deliver(OrderStateMachine stateMachine) {
            stateMachine.setCurrentState(new WaitReceiveState());
        }
    }
    
  • 待收貨狀態(tài):有收貨事件
    public class WaitReceiveState implements OrderState {
    
        @Override
        public OrderStateEnum orderStateType() {
            return OrderStateEnum.WAIT_RECEIVE;
        }
    
        @Override
        public void receive(OrderStateMachine stateMachine) {
            stateMachine.setCurrentState(new ReceivedState());
        }
    }
    
  • 已收貨狀態(tài):狀態(tài)結(jié)束點(diǎn),沒有其他事件
    public class ReceivedState implements OrderState {
    
        @Override
        public OrderStateEnum orderStateType() {
            return OrderStateEnum.RECEIVED;
        }
    
    }
    
  • 取消狀態(tài):狀態(tài)結(jié)束點(diǎn),沒有其他事件
    public class CancelState implements OrderState {
    
        @Override
        public OrderStateEnum orderStateType() {
            return OrderStateEnum.CANCEL;
        }
    }
    

2.1.3.狀態(tài)機(jī)

狀態(tài)機(jī)中需要持有當(dāng)前狀態(tài)對(duì)象,同時(shí)需要把狀態(tài)接口中的事件同步定義到狀態(tài)機(jī)中,以便外部業(yè)務(wù)對(duì)象調(diào)用。
除此之外,狀態(tài)枚舉常量與狀態(tài)對(duì)象之間的映射關(guān)系也可以直接配置在當(dāng)前狀態(tài)機(jī)中,功能更加內(nèi)聚。

public class OrderStateMachine {

    public static final Map<OrderStateEnum, OrderState> ORDER_STATE_MAP = new HashMap<>();

    static {
        ORDER_STATE_MAP.put(OrderStateEnum.WAIT_PAYMENT, new WaitPaymentState());
        ORDER_STATE_MAP.put(OrderStateEnum.WAIT_DELIVER, new WaitDeliverState());
        ORDER_STATE_MAP.put(OrderStateEnum.WAIT_RECEIVE, new WaitReceiveState());
        ORDER_STATE_MAP.put(OrderStateEnum.RECEIVED, new ReceivedState());
        ORDER_STATE_MAP.put(OrderStateEnum.CANCEL, new CancelState());
    }

    private OrderState currentState;

    public OrderStateMachine(OrderStateEnum orderStateEnum) {
        this.currentState = ORDER_STATE_MAP.get(orderStateEnum);
    }

    public OrderState getCurrentState() {
        return currentState;
    }

    public void setCurrentState(OrderState currentState) {
        this.currentState = currentState;
    }

    void pay() {
        currentState.pay(this);
    }

    void deliver() {
        currentState.deliver(this);
    }

    void receive() {
        currentState.receive(this);
    }

    void cancel() {
        currentState.cancel(this);
    }

}

2.1.4.測(cè)試

做一下狀態(tài)機(jī)的測(cè)試,由于打印的日志重復(fù)度很高,這里取了個(gè)巧,將函數(shù)作為參數(shù)封裝了一下:

public class OrderService {

    public static void main(String[] args) {
        OrderStateMachine stateMachine = new OrderStateMachine(OrderStateEnum.WAIT_DELIVER);

        invoke(stateMachine::pay, "用戶支付", stateMachine);
        invoke(stateMachine::deliver, "商家發(fā)貨", stateMachine);
        invoke(stateMachine::receive, "用戶收貨", stateMachine);
        invoke(stateMachine::cancel, "取消支付", stateMachine);
    }

    public static void invoke(Runnable runnable, String desc, OrderStateMachine stateMachine) {
        System.out.println(desc + "前訂單狀態(tài): " + stateMachine.getCurrentState().orderStateType().getDesc());
        runnable.run();
        System.out.println(desc + "后訂單狀態(tài): " + stateMachine.getCurrentState().orderStateType().getDesc());
        System.out.println("------------------");
    }
}

待發(fā)貨作為狀態(tài)常量創(chuàng)建了一個(gè)狀態(tài)機(jī),狀態(tài)機(jī)當(dāng)前的狀態(tài)就是待發(fā)貨,下面的四個(gè)調(diào)用中,第1,4個(gè)是不會(huì)改變狀態(tài)的,第2,3個(gè)會(huì)改變狀態(tài),下面以執(zhí)行結(jié)果來驗(yàn)證猜測(cè):

用戶支付前訂單狀態(tài): 待發(fā)貨
|--當(dāng)前訂單狀態(tài)不支持支付,已忽略
用戶支付后訂單狀態(tài): 待發(fā)貨
------------------
商家發(fā)貨前訂單狀態(tài): 待發(fā)貨
商家發(fā)貨后訂單狀態(tài): 待收貨
------------------
用戶收貨前訂單狀態(tài): 待收貨
用戶收貨后訂單狀態(tài): 已收貨
------------------
取消支付前訂單狀態(tài): 已收貨
|--當(dāng)前訂單狀態(tài)不支持取消,已忽略
取消支付后訂單狀態(tài): 已收貨
------------------

2.2.退款狀態(tài)的拓展

通過狀態(tài)模式來實(shí)現(xiàn)狀態(tài)機(jī),看重的就是它帶來的拓展性和易維護(hù)性,所以在原有的基礎(chǔ)上,加上退款的事件和狀態(tài),一起看看需要做些什么事。

2.2.1.代碼拓展

下面是加入了退款的狀態(tài)圖:
【設(shè)計(jì)模式】訂單狀態(tài)流傳中的狀態(tài)機(jī)與狀態(tài)模式,# 設(shè)計(jì)模式,架構(gòu)與設(shè)計(jì),設(shè)計(jì)模式,狀態(tài)模式,軟件工程
通過狀態(tài)圖可以看到,需要加入:

  • 兩個(gè)狀態(tài):退款中已退款
  • 兩個(gè)事件:申請(qǐng)退款確認(rèn)退款
  • 原有狀態(tài)拓展:待發(fā)貨、待收貨、已收貨 3個(gè)狀態(tài)中都需要引入申請(qǐng)退款事件

綜上,一步一步的拓展代碼:

  • 第一步:拓展枚舉常量
    public enum OrderStateEnum {
        WAIT_PAYMENT(1, "待支付"),
        WAIT_DELIVER(2, "待發(fā)貨"),
        WAIT_RECEIVE(3, "待收貨"),
        RECEIVED(4, "已收貨"),
        CANCEL(5, "已取消"),
        REFUNDING(6, "退款中"),
        REFUNDED(7, "已退款"),
        ;
    	// 省略后續(xù)代碼……
    }
    
  • 第二步:拓展?fàn)顟B(tài)接口
    public interface OrderState {
        // 省略已有代碼……
    
        default void refund(OrderStateMachine stateMachine) {
            System.out.println("|--當(dāng)前訂單狀態(tài)不支持退款,已忽略");
        }
    
        default void confirmRefund(OrderStateMachine stateMachine) {
            System.out.println("當(dāng)前訂單狀態(tài)不支持確認(rèn)退款,已忽略");
        }
    }
    
  • 第三步:新增兩個(gè)狀態(tài),退款中已退款
public class RefundingState implements OrderState {

    @Override
    public OrderStateEnum name() {
        return OrderStateEnum.REFUNDING;
    }

    @Override
    public void confirmRefund(OrderStateMachine stateMachine) {
        stateMachine.setCurrentState(new RefundedState());
    }
}
public class RefundedState implements OrderState {

    @Override
    public OrderStateEnum name() {
        return OrderStateEnum.REFUNDED;
    }
}
  • 第四步:拓展原有狀態(tài),待發(fā)貨,待收貨已收貨
public class WaitDeliverState implements OrderState {
    // 省略已有代碼……
    
    @Override
    public void refund(OrderStateMachine stateMachine) {
        stateMachine.setCurrentState(new RefundingState());
    }
}
public class WaitReceiveState implements OrderState {
    // 省略已有代碼……
    
    @Override
    public void refund(OrderStateMachine stateMachine) {
        stateMachine.setCurrentState(new RefundingState());
    }

}
public class ReceivedState implements OrderState {
    // 省略已有代碼……

    @Override
    public void refund(OrderStateMachine stateMachine) {
        stateMachine.setCurrentState(new RefundingState());
    }

}
  • 第五步:拓展?fàn)顟B(tài)機(jī)
public class OrderStateMachine {

    public static final Map<OrderStateEnum, OrderState> ORDER_STATE_MAP = new HashMap<>();

    static {
          // 省略已有狀態(tài)……
        ORDER_STATE_MAP.put(OrderStateEnum.REFUNDING, new RefundingState());
        ORDER_STATE_MAP.put(OrderStateEnum.REFUNDED, new RefundedState());
    }

    // 省略已有方法……

    void refund() {
        currentState.refund(this);
    }

    void confirmRefund() {
        currentState.confirmRefund(this);
    }
}

2.2.2.測(cè)試

在上面的代碼中可以看到,都是在對(duì)配置進(jìn)行追加,而沒有對(duì)原有的邏輯做任何的修改,然后寫一個(gè)測(cè)試:

public class OrderService {

    public static void main(String[] args) {
        OrderStateMachine stateMachine = new OrderStateMachine(OrderStateEnum.WAIT_DELIVER);

        invoke(stateMachine::pay, "用戶支付", stateMachine);
        invoke(stateMachine::deliver, "商家發(fā)貨", stateMachine);
        invoke(stateMachine::receive, "用戶收貨", stateMachine);
        invoke(stateMachine::cancel, "取消支付", stateMachine);
        invoke(stateMachine::refund, "申請(qǐng)退款", stateMachine);
        invoke(stateMachine::confirmRefund, "確認(rèn)退款", stateMachine);
    }

    public static void invoke(Runnable runnable, String desc, OrderStateMachine stateMachine) {
        System.out.println(desc + "前訂單狀態(tài): " + stateMachine.getCurrentState().orderStateType().getDesc());
        runnable.run();
        System.out.println(desc + "后訂單狀態(tài): " + stateMachine.getCurrentState().orderStateType().getDesc());
        System.out.println("------------------");
    }

}

查看日志,是否觸發(fā)退款:

用戶支付前訂單狀態(tài): 待發(fā)貨
|--當(dāng)前訂單狀態(tài)不支持支付,已忽略
用戶支付后訂單狀態(tài): 待發(fā)貨
------------------
商家發(fā)貨前訂單狀態(tài): 待發(fā)貨
商家發(fā)貨后訂單狀態(tài): 待收貨
------------------
用戶收貨前訂單狀態(tài): 待收貨
用戶收貨后訂單狀態(tài): 已收貨
------------------
取消支付前訂單狀態(tài): 已收貨
|--當(dāng)前訂單狀態(tài)不支持取消,已忽略
取消支付后訂單狀態(tài): 已收貨
------------------
申請(qǐng)退款前訂單狀態(tài): 已收貨
申請(qǐng)退款后訂單狀態(tài): 退款中
------------------
確認(rèn)退款前訂單狀態(tài): 退款中
確認(rèn)退款后訂單狀態(tài): 已退款
------------------

2.3.小結(jié)

從上面的代碼可以看到,通過狀態(tài)模式可以很輕松的對(duì)狀態(tài)進(jìn)行拓展。

不過上面的例子中沒有對(duì)狀態(tài)機(jī)中的動(dòng)作進(jìn)行實(shí)現(xiàn),其實(shí)動(dòng)作和狀態(tài)轉(zhuǎn)換的邏輯放在一起就可以了,即通過事件(方法調(diào)用) 可以變更狀態(tài),同時(shí)也能夠觸發(fā)對(duì)應(yīng)的動(dòng)作。

此外,代碼中只是狀態(tài)機(jī)的流程,實(shí)際的開發(fā)中應(yīng)該將狀態(tài)機(jī)關(guān)聯(lián)到對(duì)應(yīng)的業(yè)務(wù)實(shí)體中,通過業(yè)務(wù)實(shí)體的實(shí)時(shí)狀態(tài)來創(chuàng)建狀態(tài)機(jī),在完成狀態(tài)流轉(zhuǎn)之后再將狀態(tài)更新到業(yè)務(wù)實(shí)體中。

3.總結(jié)

本篇主要講述了如何通過狀態(tài)模式來實(shí)現(xiàn)一個(gè)狀態(tài)機(jī)。狀態(tài)模式的實(shí)現(xiàn),代碼結(jié)構(gòu)清晰(相對(duì)于if/else,switch)拓展性強(qiáng),同時(shí)也起到了良好的封裝效果(狀態(tài)在狀態(tài)機(jī)內(nèi)部流轉(zhuǎn),業(yè)務(wù)流程不需要關(guān)心狀態(tài)到底是怎么流轉(zhuǎn)的)。

當(dāng)然缺點(diǎn)就是類膨脹問題,類會(huì)比較多,如果狀態(tài)非常復(fù)雜的情況下,也可以采取其他辦法來實(shí)現(xiàn)狀態(tài)機(jī),例如查表法。

總之,要分析并實(shí)現(xiàn)一個(gè)業(yè)務(wù)流程中的狀態(tài)流轉(zhuǎn)的時(shí)候,先畫出狀態(tài)圖,以狀態(tài)圖為指導(dǎo)來選擇狀態(tài)機(jī)的實(shí)現(xiàn)方式即可,在狀態(tài)相對(duì)不那么復(fù)雜的情況下,可以優(yōu)先考慮使用狀態(tài)模式。

附:《【UML建?!繝顟B(tài)圖(State Machine Diagram)》文章來源地址http://www.zghlxwxcb.cn/news/detail-657998.html

到了這里,關(guān)于【設(shè)計(jì)模式】訂單狀態(tài)流傳中的狀態(tài)機(jī)與狀態(tài)模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 設(shè)計(jì)模式-狀態(tài)模式

    設(shè)計(jì)模式-狀態(tài)模式

    一個(gè)對(duì)象有狀態(tài)變化 每次狀態(tài)變化都會(huì)觸發(fā)一個(gè)邏輯 不能總是用 if else 來控制 交通信號(hào)燈不同顏色的變化 傳統(tǒng)UML類圖 簡(jiǎn)化后的UML類圖 有限個(gè)狀態(tài)、以及在這些狀態(tài)之間的變化 如交通信號(hào)燈 使用開源lib:javascript-state-machine github.com/jakesgordon/javascript-state-machine 有限狀態(tài)機(jī)

    2024年02月07日
    瀏覽(15)
  • 設(shè)計(jì)模式(18):狀態(tài)模式

    用于解決系統(tǒng)中復(fù)雜對(duì)象的狀態(tài)轉(zhuǎn)換以及不同狀態(tài)下行為的封裝問題 環(huán)境類(Context): 環(huán)境類中維護(hù)一個(gè)State對(duì)象,它定義了當(dāng)前的狀態(tài),并委托當(dāng)前狀態(tài)處理一些請(qǐng)求; 抽象狀態(tài)類(State): 用于封裝對(duì)象的一個(gè)特定狀態(tài)所對(duì)應(yīng)的行為; 具體狀態(tài)類(ConcreteState): 實(shí)現(xiàn)了抽象狀態(tài)類

    2024年04月09日
    瀏覽(18)
  • 《設(shè)計(jì)模式》狀態(tài)模式

    《設(shè)計(jì)模式》狀態(tài)模式

    定義 : 狀態(tài)模式也稱為狀態(tài)機(jī)模式, 允許對(duì)象在內(nèi)部狀態(tài)發(fā)生改變時(shí)改變它的行為,對(duì)象看起來好像修改了它的類。 屬于 行為型 模式。 狀態(tài)模式的角色組成 : State(抽象狀態(tài)類) :定義一個(gè)接口用來封裝與環(huán)境類的一個(gè)特定狀態(tài)相關(guān)的行為,可以有一個(gè)或多個(gè)行為。 Con

    2024年02月05日
    瀏覽(18)
  • 行為型設(shè)計(jì)模式——狀態(tài)模式

    行為型設(shè)計(jì)模式——狀態(tài)模式

    狀態(tài)模式是比較簡(jiǎn)單的設(shè)計(jì)模式,它的主要作用是減少代碼中大量的 if-else 或者 switch-case 等邏輯判斷(俗稱屎山)。它將每個(gè)狀態(tài)定義為一個(gè)類,而每個(gè)狀態(tài)類有自己對(duì)應(yīng)的方法,因此當(dāng)需要根據(jù)狀態(tài)執(zhí)行邏輯代碼時(shí)不需要寫大量的if-else判斷是哪個(gè)狀態(tài)然后執(zhí)行對(duì)應(yīng)的邏輯

    2024年02月02日
    瀏覽(30)
  • 設(shè)計(jì)模式行為型-狀態(tài)模式

    設(shè)計(jì)模式行為型-狀態(tài)模式

    狀態(tài)模式是一種行為型設(shè)計(jì)模式,用于處理對(duì)象在不同狀態(tài)下的行為變化。它將對(duì)象的行為封裝在不同狀態(tài)類中,通過狀態(tài)的切換實(shí)現(xiàn)不同行為的觸發(fā)。 本文將介紹狀態(tài)模式的基本概念、應(yīng)用場(chǎng)景以及優(yōu)勢(shì)與適用性。 實(shí)現(xiàn)具體狀態(tài)類 具體工作類: 上下文類包含狀態(tài)對(duì)象的引

    2024年02月10日
    瀏覽(25)
  • Java設(shè)計(jì)模式-狀態(tài)模式

    在軟件開發(fā)領(lǐng)域,設(shè)計(jì)模式是一組經(jīng)過驗(yàn)證的、被廣泛接受的解決問題的方案。其中之一是狀態(tài)模式,它提供了一種優(yōu)雅的方式來管理對(duì)象的不同狀態(tài)。 狀態(tài)模式是一種行為型設(shè)計(jì)模式,它允許對(duì)象在內(nèi)部狀態(tài)發(fā)生改變時(shí)改變其行為。狀態(tài)模式將對(duì)象的行為封裝在不同的狀態(tài)

    2024年02月06日
    瀏覽(25)
  • 設(shè)計(jì)模式之狀態(tài)模式(下)

    設(shè)計(jì)模式之狀態(tài)模式(下)

    3)共享狀態(tài) 1.概述 在某些情況下,多個(gè)環(huán)境對(duì)象可能需要共享同一個(gè)狀態(tài),如果希望在系統(tǒng)中實(shí)現(xiàn)多個(gè)環(huán)境對(duì)象共享一個(gè)或多個(gè)狀態(tài)對(duì)象,那么需要將這些狀態(tài)對(duì)象定義為環(huán)境類的靜態(tài)成員對(duì)象。 2.案例 背景 :要求兩個(gè)開關(guān)對(duì)象要么都處于開的狀態(tài),要么都處于關(guān)的狀態(tài),

    2024年04月25日
    瀏覽(23)
  • 設(shè)計(jì)模式淺析(十一) ·狀態(tài)模式

    設(shè)計(jì)模式淺析(十一) ·狀態(tài)模式

    日常叨逼叨 java設(shè)計(jì)模式淺析,如果覺得對(duì)你有幫助,記得一鍵三連,謝謝各位觀眾老爺???? 狀態(tài)模式 概念 狀態(tài)模式 Java中的狀態(tài)模式(State Pattern)是一種行為型設(shè)計(jì)模式,它允許一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變時(shí)改變它的行為,看起來就像修改了它的類一樣。狀態(tài)模式的核心

    2024年04月12日
    瀏覽(19)
  • 設(shè)計(jì)模式行為型——狀態(tài)模式

    設(shè)計(jì)模式行為型——狀態(tài)模式

    ? 目錄 狀態(tài)模式的定義 狀態(tài)模式的實(shí)現(xiàn) 狀態(tài)模式角色 狀態(tài)模式類圖 狀態(tài)模式舉例 狀態(tài)模式代碼實(shí)現(xiàn) 狀態(tài)模式的特點(diǎn) 優(yōu)點(diǎn) 缺點(diǎn) 使用場(chǎng)景 注意事項(xiàng) 實(shí)際應(yīng)用 ? ? ? ?在軟件開發(fā)過程中,應(yīng)用程序中的部分對(duì)象可能會(huì)根據(jù)不同的情況做出不同的行為,把這種對(duì)象稱為有狀態(tài)

    2024年02月14日
    瀏覽(24)
  • 設(shè)計(jì)模式再探——狀態(tài)模式

    設(shè)計(jì)模式再探——狀態(tài)模式

    最近產(chǎn)品中有這樣的業(yè)務(wù)需求,不同時(shí)間(這里不是活動(dòng)的執(zhí)行時(shí)間,而是活動(dòng)的執(zhí)行時(shí)刻)展示不同的活動(dòng); 要求還是需要后續(xù)會(huì)由N種活動(dòng)擴(kuò)充進(jìn)來,并且擴(kuò)充的時(shí)候還得達(dá)到復(fù)用之前活動(dòng)中的一些屬性和方法。 結(jié)合這樣的需求,再探狀態(tài)模式,豁然開朗,于是乎總結(jié)分享

    2024年02月16日
    瀏覽(15)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包