Java實(shí)現(xiàn)狀態(tài)模式的示例代碼
一、簡(jiǎn)介
1、定義
狀態(tài)模式 (State Pattern)是一種行為型設(shè)計(jì)模式,允許對(duì)象在內(nèi)部狀態(tài)改變時(shí)改變它的行為。通過(guò)定義狀態(tài)接口和具體狀態(tài)類(lèi),將對(duì)象的狀態(tài)和行為分開(kāi),使得狀態(tài)改變時(shí)可以改變行為。
2、狀態(tài)模式的結(jié)構(gòu)
狀態(tài)模式涉及以下幾個(gè)角色:
State(狀態(tài)接口):定義了狀態(tài)類(lèi)的共同接口,所有具體的狀態(tài)類(lèi)都實(shí)現(xiàn)這個(gè)接口。
ConcreteState(具體狀態(tài)類(lèi)):每個(gè)具體的狀態(tài)類(lèi)實(shí)現(xiàn)了State接口,并定義了在該狀態(tài)下的具體行為。
Context(上下文):上下文類(lèi)維護(hù)一個(gè)當(dāng)前狀態(tài)的引用,它通常會(huì)委托給具體的狀態(tài)類(lèi)來(lái)執(zhí)行相應(yīng)的狀態(tài)切換。
二、Java實(shí)現(xiàn)案例
1、電燈開(kāi)關(guān)狀態(tài)案例
/** * @Description: 狀態(tài)接口 * @Date: 2025-02-07 17:09 * @Author: gaoyufei **/ public interface State { void handle(Switch context); } /** * @Description: 關(guān)燈狀態(tài) * @Date: 2025-02-07 17:12 * @Author: gaoyufei **/ public class CloseState implements State{ @Override public void handle(Switch switcher) { switcher.setState(new OpenState()); System.out.println("開(kāi)燈了"); } } /** * @Description: 開(kāi)燈狀態(tài) * @Date: 2025-02-07 17:11 * @Author: gaoyufei **/ public class OpenState implements State{ @Override public void handle(Switch switcher) { switcher.setState(new CloseState()); System.out.println("關(guān)燈了"); } } /** * @Description: 開(kāi)關(guān),持有燈的狀態(tài) * @Date: 2025-02-07 17:08 * @Author: gaoyufei **/ public class Switch { private State state; public Switch(State state){ this.state=state; } public void setState(State state){ this.state=state; } public void press(){ state.handle(this); } } /** * @Description: 操作人 * @Date: 2025-02-07 17:14 * @Author: gaoyufei **/ public class Operator { public static void main(String[] args) throws InterruptedException { Switch switcher=new Switch(new CloseState());//初始狀態(tài)是關(guān)燈 //模擬每隔1秒按壓一下開(kāi)關(guān) while (true){ Thread.sleep(1000); switcher.press(); } } }
2、番茄工作法狀態(tài)案例
/** * @Description: 番茄狀態(tài)接口 * @Date: 2025-02-08 10:49 * @Author: gaoyufei **/ public interface TomatoState { void deal(Worker worker); } /** * @Description: 番茄-工作狀態(tài)類(lèi) * @Date: 2025-02-08 10:51 * @Author: gaoyufei **/ public class WorkTomatoState implements TomatoState { @Override public void deal(Worker worker) { System.out.println("休息結(jié)束了,開(kāi)始工作吧"); try { Thread.sleep(25*60*1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("工作了25分鐘"); worker.setTomatoState(new RestTomatoState()); } } /** * @Description: 番茄-休息狀態(tài)類(lèi) * @Date: 2025-02-08 10:53 * @Author: gaoyufei **/ public class RestTomatoState implements TomatoState{ @Override public void deal(Worker worker) { System.out.println("工作結(jié)束了,好好休息吧"); try { Thread.sleep(5*60*1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("休息了5分鐘"); worker.setTomatoState(new WorkTomatoState()); } } /** * @Description: 工作者 * @Date: 2025-02-08 10:51 * @Author: gaoyufei **/ public class Worker { private TomatoState tomatoState; public Worker(TomatoState tomatoState){ this.tomatoState=tomatoState; } public void setTomatoState(TomatoState tomatoState){ this.tomatoState=tomatoState; } public void startTomatoClock(){ this.tomatoState.deal(this); } } /** * @Description: 客戶(hù)端 * @Date: 2025-02-08 11:02 * @Author: gaoyufei **/ public class Client { public static void main(String[] args) { Worker worker=new Worker(new WorkTomatoState()); while (true){ worker.startTomatoClock(); } } }
3、電梯狀態(tài)案例
這是一個(gè)簡(jiǎn)單的電梯系統(tǒng)。電梯的狀態(tài)有關(guān)門(mén)、開(kāi)門(mén)、上升、下降、停止。每個(gè)狀態(tài)下電梯的行為不同。通過(guò)狀態(tài)模式,根據(jù)電梯的不同狀態(tài)執(zhí)行不同的行為。
/** * @Description: 電梯狀態(tài)接口 * @Date: 2025-02-08 9:02 * @Author: gaoyufei **/ public interface ElevatorState { void openDoor(); void closeDoor(); void moveUp(); void moveDown(); void stop(); } /** * @Description: 關(guān)門(mén)狀態(tài) * @Date: 2025-02-08 9:05 * @Author: gaoyufei **/ public class CloseState implements ElevatorState { private Elevator elevator; public CloseState(Elevator elevator){ this.elevator=elevator; } @Override public void openDoor() { System.out.println("電梯門(mén)開(kāi)了"); elevator.setCurrentState(elevator.getOpenState()); } @Override public void closeDoor() { System.out.println("電梯門(mén)已經(jīng)關(guān)了"); } @Override public void moveUp() { System.out.println("電梯上升"); elevator.setCurrentState(elevator.getMovingUpState()); } @Override public void moveDown() { System.out.println("電梯下降"); elevator.setCurrentState(elevator.getMovingDownState()); } @Override public void stop() { System.out.println("電梯停止"); elevator.setCurrentState(elevator.getStopState()); } } /** * @Description: 開(kāi)門(mén)狀態(tài) * @Date: 2025-02-08 9:07 * @Author: gaoyufei **/ public class OpenState implements ElevatorState{ private Elevator elevator; public OpenState(Elevator elevator){ this.elevator=elevator; } @Override public void openDoor() { System.out.println("電梯門(mén)已經(jīng)打開(kāi)"); } @Override public void closeDoor() { System.out.println("電梯門(mén)關(guān)了"); elevator.setCurrentState(elevator.getCloseState()); } @Override public void moveUp() { System.out.println("電梯門(mén)打開(kāi)狀態(tài),不能上升"); } @Override public void moveDown() { System.out.println("電梯門(mén)打開(kāi)狀態(tài),不能下降"); } @Override public void stop() { System.out.println("電梯門(mén)打開(kāi)狀態(tài),不能變換為停止?fàn)顟B(tài)"); } } /** * @Description: 停止?fàn)顟B(tài) * @Date: 2025-02-08 9:59 * @Author: gaoyufei **/ public class StopState implements ElevatorState{ private Elevator elevator; public StopState(Elevator elevator){ this.elevator=elevator; } @Override public void openDoor() { System.out.println("電梯門(mén)開(kāi)了"); elevator.setCurrentState(elevator.getOpenState()); } @Override public void closeDoor() { System.out.println("電梯門(mén)關(guān)了"); elevator.setCurrentState(elevator.getCloseState()); } @Override public void moveUp() { System.out.println("電梯上升"); elevator.setCurrentState(elevator.getMovingUpState()); } @Override public void moveDown() { System.out.println("電梯下降"); elevator.setCurrentState(elevator.getMovingDownState()); } @Override public void stop() { System.out.println("電梯停止"); } } /** * @Description: 上升狀態(tài) * @Date: 2025-02-08 9:07 * @Author: gaoyufei **/ public class MovingUpState implements ElevatorState{ private Elevator elevator; public MovingUpState(Elevator elevator){ this.elevator=elevator; } @Override public void openDoor() { System.out.println("電梯正在上升,不能開(kāi)門(mén)"); } @Override public void closeDoor() { System.out.println("電梯已經(jīng)關(guān)門(mén)"); } @Override public void moveUp() { System.out.println("電梯正在上升"); } @Override public void moveDown() { System.out.println("電梯下降"); elevator.setCurrentState(elevator.getMovingDownState()); } @Override public void stop() { System.out.println("電梯停止"); elevator.setCurrentState(elevator.getStopState()); } } /** * @Description: 下降狀態(tài) * @Date: 2025-02-08 9:08 * @Author: gaoyufei **/ public class MovingDownState implements ElevatorState{ private Elevator elevator; public MovingDownState(Elevator elevator){ this.elevator=elevator; } @Override public void openDoor() { System.out.println("電梯正在下降,不能開(kāi)門(mén)"); } @Override public void closeDoor() { System.out.println("電梯正在下降,已經(jīng)關(guān)門(mén)了"); } @Override public void moveUp() { System.out.println("電梯上升"); elevator.setCurrentState(elevator.getMovingUpState()); } @Override public void moveDown() { System.out.println("電梯正在下降"); } @Override public void stop() { System.out.println("電梯停止"); elevator.setCurrentState(elevator.getStopState()); } } /** * @Description: 電梯 * @Date: 2025-02-08 9:04 * @Author: gaoyufei **/ public class Elevator { private ElevatorState closeState; private ElevatorState openState; private ElevatorState movingDownState; private ElevatorState movingUpState; private ElevatorState stopState; private ElevatorState currentState; public Elevator(){ closeState=new CloseState(this); openState=new OpenState(this); movingDownState=new MovingDownState(this); movingUpState=new MovingUpState(this); stopState=new StopState(this); currentState=closeState;// 默認(rèn)初始狀態(tài)為關(guān)閉狀態(tài) } public void setCurrentState(ElevatorState currentState) { this.currentState = currentState; } public ElevatorState getCloseState() { return closeState; } public ElevatorState getOpenState() { return openState; } public ElevatorState getMovingDownState() { return movingDownState; } public ElevatorState getMovingUpState() { return movingUpState; } public ElevatorState getStopState() { return stopState; } public void openDoor(){ currentState.openDoor(); } public void closeDoor(){ currentState.closeDoor(); } public void moveUp(){ currentState.moveUp(); } public void moveDown(){ currentState.moveDown(); } public void stop(){ currentState.stop(); } } /** * @Description: 客戶(hù)端 * @Date: 2025-02-08 9:29 * @Author: gaoyufei **/ public class Client { public static void main(String[] args) { //初始關(guān)閉狀態(tài) Elevator elevator=new Elevator(); //關(guān)門(mén) elevator.closeDoor();//輸出 電梯門(mén)已經(jīng)關(guān)了 //開(kāi)門(mén) elevator.openDoor();//輸出 電梯門(mén)開(kāi)了 //上升 elevator.moveUp();//輸出 電梯門(mén)打開(kāi)狀態(tài)不能上升 //關(guān)門(mén) elevator.closeDoor();//輸出 電梯門(mén)關(guān)了 //上升 elevator.moveUp();//輸出 電梯上升 //關(guān)門(mén) elevator.closeDoor();//輸出 電梯已經(jīng)關(guān)門(mén) //下降 elevator.moveDown();//輸出 電梯下降 //停止 elevator.stop();//輸出 電梯停止 //開(kāi)門(mén) elevator.openDoor();//輸出 電梯門(mén)開(kāi)了 //停止 elevator.stop();//輸出 電梯門(mén)打開(kāi)狀態(tài),不能變換為停止?fàn)顟B(tài) } }
到此這篇關(guān)于Java實(shí)現(xiàn)狀態(tài)模式的示例代碼的文章就介紹到這了,更多相關(guān)Java 狀態(tài)模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java中的有限狀態(tài)機(jī)(設(shè)計(jì)模式——狀態(tài)模式)
- Java設(shè)計(jì)模式之狀態(tài)模式詳解
- 淺析Java語(yǔ)言中狀態(tài)模式的優(yōu)點(diǎn)
- Java設(shè)計(jì)模式之狀態(tài)模式
- 深入理解Java設(shè)計(jì)模式之狀態(tài)模式
- Java設(shè)計(jì)模式之java狀態(tài)模式詳解
- 詳解JAVA 設(shè)計(jì)模式之狀態(tài)模式
- Java基于狀態(tài)模式實(shí)現(xiàn)的文檔編輯模式切換功能實(shí)例
- 輕松掌握J(rèn)ava狀態(tài)模式
相關(guān)文章
Java Management Extensions管理擴(kuò)展原理解析
這篇文章主要介紹了Java Management Extensions管理擴(kuò)展原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04使用Java?Executors創(chuàng)建線(xiàn)程池的9種方法
文章主要介紹了?Java?中Executors類(lèi)創(chuàng)建線(xiàn)程池的?9?種方法,每種方法都詳細(xì)闡述了實(shí)現(xiàn)原理、源代碼分析、參數(shù)解釋、實(shí)現(xiàn)過(guò)程、特性和使用場(chǎng)景,感興趣的小伙伴跟著小編一起來(lái)看看吧2024-11-11Maven配置倉(cāng)庫(kù)、阿里云鏡像、環(huán)境變量(史上最全)
本文主要介紹了Maven配置倉(cāng)庫(kù)、阿里云鏡像、環(huán)境變量,文中通過(guò)圖文示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-07-07Springboot?RestTemplate設(shè)置超時(shí)時(shí)間的簡(jiǎn)單方法
學(xué)習(xí)springboot ,RestTemplate的使用場(chǎng)景非常非常多,比如springcloud中的服務(wù)消費(fèi),下面這篇文章主要給大家介紹了關(guān)于Springboot?RestTemplate設(shè)置超時(shí)時(shí)間的簡(jiǎn)單方法,需要的朋友可以參考下2022-01-01Java使用String.format方法格式化字符串的示例詳解
在編程過(guò)程中,我們經(jīng)常需要?jiǎng)?chuàng)建格式化的字符串來(lái)滿(mǎn)足特定的需求,比如生成用戶(hù)友好的消息、構(gòu)建報(bào)告或是輸出調(diào)試信息,Java 提供了一個(gè)強(qiáng)大的工具——String.format 方法,本文給大家介紹了Java使用String.format方法格式化字符串的示例,需要的朋友可以參考下2024-11-11Mybatis-Plus中updateById方法不能更新空值問(wèn)題解決
本文主要介紹了Mybatis-Plus中updateById方法不能更新空值問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08IDEA 中創(chuàng)建Spring Data Jpa 項(xiàng)目的示例代碼
這篇文章主要介紹了IDEA 中創(chuàng)建Spring Data Jpa 項(xiàng)目的示例代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04