日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

行为型模式:状态模式

發布時間:2024/1/17 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 行为型模式:状态模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

十一大行為型模式之八:狀態模式。

簡介

姓名 :狀態模式

英文名 :State Pattern

價值觀 :有啥事讓狀態我來維護

個人介紹

Allow an object to alter its behavior when its internal state changes.The object will appear to change its class.

當一個對象內在狀態改變時允許其改變行為,這個對象看起來像改變了其類。

(來自《設計模式之禪》)

你要的故事

現在有好多個人貸款軟件,比如:支付寶、360借條(打廣告。。。)等等。貸款會有一個用戶狀態流程,游客->注冊用戶->授信用戶->借款用戶(這里簡化了狀態,只用 4 個)。每個狀態擁有的權限不一樣,如下圖所示。

從上圖可以看到,一個用戶有 3 種行為,分別是注冊、授信、借款。當注冊成功后,用戶的狀態就從『游客』改變為『注冊用戶』;當授信成功后,用戶的狀態就從『注冊用戶』改變為『授信用戶』;當借款成功后,用戶的狀態就從『授信用戶』改變為『借款用戶』。現在我們就來實現用戶注冊、授信、借款的過程,因為每個狀態的權限不一樣,所以這里需要根據用戶的狀態來限制用戶行為。

很快,我們就完成下面的代碼。

class User {private String state;public String getState() {return state;}public void setState(String state) {this.state = state;}public void register() {if ("none".equals(state)) {System.out.println("游客。注冊中。。。");}else if ("register".equals(state)) {System.out.println("注冊用戶。不需要再注冊。");} else if ("apply".equals(state)) {System.out.println("授信用戶。不需要再注冊。");} else if ("draw".equals(state)) {System.out.println("借款用戶。不需要再注冊。");}}public void apply() {if ("none".equals(state)) {System.out.println("游客。不能申請授信。");}else if ("register".equals(state)) {System.out.println("注冊用戶。授信申請中。。。");} else if ("apply".equals(state)) {System.out.println("授信用戶。不需要再授信。");} else if ("draw".equals(state)) {System.out.println("借款用戶。不需要再授信。");}}public void draw(double money) {if ("none".equals(state)) {System.out.println("游客。申請借款【" + money + "】元。不能申請借款。");} else if ("register".equals(state)) {System.out.println("注冊用戶。申請借款【" + money + "】元。還沒授信,不能借款。");} else if ("apply".equals(state)) {System.out.println("授信用戶。申請借款【" + money + "】元。申請借款中。。。");} else if ("draw".equals(state)) {System.out.println("授信用戶。申請借款【" + money + "】元。申請借款中。。。");}} }public class NoStateTest {public static void main(String[] args) {User user = new User();user.setState("register");user.draw(1000);}}打印結果: 注冊用戶。申請借款【1000.0】元。還沒授信,不能借款。 復制代碼

上面代碼實現了用戶 register (注冊),apply (授信),draw (借款) 這 3 種行為,每個行為都會根據狀態 state 來做權限控制。看起來有點繁瑣,擴展性不高,假設新增了一個狀態,那么注冊、授信、借款這 3 種行為的代碼都要修改。下面通過狀態模式來解決這個問題。

我們把狀態給抽出來,作為一個接口,因為在每種狀態中都可能有注冊、授信、借款行為,所以把這 3 個行為作為狀態接口的方法,讓每個狀態子類都實現相應的行為控制。如下代碼所示。

interface State {void register();void apply();void draw(double money); }/*** 游客*/ class NoneState implements State {@Overridepublic void register() {System.out.println("游客。注冊中。。。");}@Overridepublic void apply() {System.out.println("游客。不能申請授信。");}@Overridepublic void draw(double money) {System.out.println("游客。申請借款【" + money + "】元。不能申請借款。");} }/*** 注冊狀態*/ class RegisterState implements State {@Overridepublic void register() {System.out.println("注冊用戶。不需要再注冊。");}@Overridepublic void apply() {System.out.println("注冊用戶。授信申請中。。。");}@Overridepublic void draw(double money) {System.out.println("注冊用戶。申請借款【" + money + "】元。還沒授信,不能借款。");} }/*** 授信狀態*/ class ApplyState implements State {@Overridepublic void register() {System.out.println("授信用戶。不需要再注冊。");}@Overridepublic void apply() {System.out.println("授信用戶。不需要再授信。");}@Overridepublic void draw(double money) {System.out.println("授信用戶。申請借款【" + money + "】元。申請借款中。。。");} }/*** 借款狀態*/ class DrawState implements State {@Overridepublic void register() {System.out.println("借款用戶。不需要再注冊。");}@Overridepublic void apply() {System.out.println("借款用戶。不需要再授信。");}@Overridepublic void draw(double money) {System.out.println("申請借款【" + money + "】元。申請借款中。。。");} }class User1 {private State state;public State getState() {return state;}public void setState(State state) {this.state = state;}public void register() {this.state.register();}public void apply() {this.state.apply();}public void draw(double money) {this.state.draw(money);} }public class StateTest {public static void main(String[] args) {User1 user1 = new User1();user1.setState(new RegisterState());user1.apply();user1.draw(1000);user1.setState(new ApplyState());user1.draw(2000);}}打印結果: 注冊用戶。授信申請中。。。 注冊用戶。申請借款【1000.0】元。還沒授信,不能借款。 授信用戶。申請借款【2000.0】元。申請借款中。。。 復制代碼

看上面代碼,我們抽象了 State 接口,4 種狀態分別用 NoneState (游客)、RegisterState (注冊)、ApplyState (授信)、DrawState (借款) 表示。而每個狀態都有 3 種行為,它們各自對這些行為進行權限控制。這樣子實現可以讓權限邏輯分離開,分散到每個狀態里面去,如果以后要業務擴展,要新增狀態,那就很方便了,只需要再實現一個狀態類就可以,不會影響到其他代碼。這也是為什么《阿里巴巴 Java 開發手冊》里面講的,當超過 3 層的 if-else 的邏輯判斷代碼,推薦用狀態模式來重構代碼。

總結

狀態模式 很好的減低了代碼的復雜性,從而提高了系統的可維護性。在業務開發中可以嘗試使用,比如在迭代開發中,業務邏輯越來越復雜,從而不得不使用很多 if-else 語句來實現時,就可以考慮一下是不是可以用 狀態模式 來重構,特別是一些有狀態流程轉換方面的業務。看到這篇文章,想想工作中是不是有些復雜的代碼可以重構,趕緊行動起來。

推薦閱讀:

行為型模式:觀察者模式

行為型模式:迭代器模式

行為型模式:策略模式

設計模式系列文章持續更新中,歡迎關注公眾號 LieBrother,一起交流學習。

總結

以上是生活随笔為你收集整理的行为型模式:状态模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。