設計模式 狀態模式

2022-07-04 17:33:11 字數 4634 閱讀 4529

問題場景:

對於乙個訂單在不同的階段有不同的狀態,不同的狀態處理邏輯也不一樣。如果使用if/esle來判斷訂單狀態,從而實現不同的操作。這樣難以應對變化,增加乙個狀態,我們就需要增加乙個分之,還可能影響原有邏輯判斷。

if(待支付)else if(已付款)else if(代發貨)else if(已發貨)

tobepaystate

package com.nijunyang.designpatterns.state;

/** * @author: create by nijunyang

* @date:2019/9/22

*/public class tobepaystate extends state

@override

void pay()

@override

void checkpay()

@override

void delivergoods()

@override

void tobereceive()

@override

void receive()

@override

void other()

}

paidstate

package com.nijunyang.designpatterns.state;

/** * @author: create by nijunyang

* @date:2019/9/22

*/public class paidstate extends state

@override

void pay()

@override

void checkpay()

@override

void delivergoods()

@override

void tobereceive()

@override

void receive()

@override

void other()

}

delivergoodsstate
package com.nijunyang.designpatterns.state;

/** * @author: create by nijunyang

* @date:2019/9/22

*/public class delivergoodsstate extends state

@override

void pay()

@override

void checkpay()

@override

void delivergoods()

@override

void tobereceive()

@override

void receive()

@override

void other()

}

goodstobereceivedstate

package com.nijunyang.designpatterns.state;

/** * @author: create by nijunyang

* @date:2019/9/22

*/public class goodstobereceivedstate extends state

@override

void pay()

@override

void checkpay()

@override

void delivergoods()

@override

void tobereceive()

@override

void receive()

@override

void other()

}

goodsreceivedstate

package com.nijunyang.designpatterns.state;

/** * @author: create by nijunyang

* @date:2019/9/22

*/public class goodsreceivedstate extends state

@override

void pay()

@override

void checkpay()

@override

void delivergoods()

@override

void tobereceive()

@override

void receive()

@override

void other()

}

successstate

package com.nijunyang.designpatterns.state;

/** * @author: create by nijunyang

* @date:2019/9/22

*/public class successstate extends state

@override

void pay()

@override

void checkpay()

@override

void delivergoods()

@override

void tobereceive()

@override

void receive()

@override

void other()

}

context

ordercontext
package com.nijunyang.designpatterns.state;

/** * @author: create by nijunyang

* @date:2019/9/22

*/public class ordercontext

public void topay()

public void checkpay()

public void delivergoods()

public void tobereceive()

public void receive()

public void end()

public state getstate()

public void setstate(state state)

public tobepaystate gettobepaystate()

public void settobepaystate(tobepaystate tobepaystate)

public paidstate getpaidstate()

public void setpaidstate(paidstate paidstate)

public delivergoodsstate getdelivergoodsstate()

public void setdelivergoodsstate(delivergoodsstate delivergoodsstate)

public successstate getsuccessstate()

public void setsuccessstate(successstate successstate)

public goodstobereceivedstate getgoodstobereceivedstate()

public void setgoodstobereceivedstate(goodstobereceivedstate goodstobereceivedstate)

public goodsreceivedstate getgoodsreceivedstate()

public void setgoodsreceivedstate(goodsreceivedstate goodsreceivedstate)

}

測試:

以上**的實現都是按照最簡單的正常流程走的,實際上,不同state的實現類裡面不同的方法還會操作修改狀態,這個就要根據實際的業務流程來控制了。

簡單總結:

使用狀態模式**有很強的可讀性。狀態模式將每個狀態的行為封裝到對應的乙個類中方便維護。

減少if/else。符合「開閉原則」。容易增刪狀態。

但是會產生很多類,每個狀態都要乙個對應的類,當狀態過多時會產生很多類,加大維護成本。

當乙個事件或者物件有很多種狀態,狀態之間會相互轉換,對不同的狀態要求有不同的行為的時候,可以考慮使用狀態模式

設計模式 狀態模式

狀態模式 當乙個物件的內在狀態改變時允許改變其行為,這個物件看起來像是改變了其類。狀態模式主要解決的是當控制乙個物件狀態轉換的條件表示式過於複雜時的情況,把狀態的判斷邏輯轉移到表示不同狀態的一些列類當中,可以把複雜的判斷邏輯簡化。當乙個物件的行為取決於它的狀態,並且它必須在執行時刻根據狀態改變它的行...

設計模式 狀態模式

1.概述 當乙個物件的內在狀態改變時允許改變其行為,這個物件看起來像是改變了其類。2.解決的問題 主要解決的是當控制乙個物件狀態轉換的條件表示式過於複雜時的情況。把狀態的判斷邏輯轉移到表示不同的一系列類當中,可以把複雜的邏輯判斷簡單化。3.模式中的角色 3.1 上下文環境 context 它定義了客...

設計模式 狀態模式

描述 允許物件在內部狀態改變時改變它的行為,物件看起來好像修改了它的類。主要解決的是當控制乙個物件狀態轉換的條件表示式過於複雜時的情況。把狀態的判斷邏輯轉移到表示不同的一系列類當中,可以把複雜的邏輯判斷簡單化。通常應用在有好多狀態的流程中。類圖 以下程式模擬糖果機器投幣取糖果的狀態流程。1.定義狀態...