Java實現(xiàn)狀態(tài)模式的示例代碼
一、簡介
1、定義
狀態(tài)模式 (State Pattern)是一種行為型設(shè)計模式,允許對象在內(nèi)部狀態(tài)改變時改變它的行為。通過定義狀態(tài)接口和具體狀態(tài)類,將對象的狀態(tài)和行為分開,使得狀態(tài)改變時可以改變行為。
2、狀態(tài)模式的結(jié)構(gòu)
狀態(tài)模式涉及以下幾個角色:
State(狀態(tài)接口):定義了狀態(tài)類的共同接口,所有具體的狀態(tài)類都實現(xiàn)這個接口。
ConcreteState(具體狀態(tài)類):每個具體的狀態(tài)類實現(xiàn)了State接口,并定義了在該狀態(tài)下的具體行為。
Context(上下文):上下文類維護(hù)一個當(dāng)前狀態(tài)的引用,它通常會委托給具體的狀態(tài)類來執(zhí)行相應(yīng)的狀態(tài)切換。
二、Java實現(xiàn)案例
1、電燈開關(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("開燈了"); } } /** * @Description: 開燈狀態(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: 開關(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秒按壓一下開關(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)類 * @Date: 2025-02-08 10:51 * @Author: gaoyufei **/ public class WorkTomatoState implements TomatoState { @Override public void deal(Worker worker) { System.out.println("休息結(jié)束了,開始工作吧"); try { Thread.sleep(25*60*1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("工作了25分鐘"); worker.setTomatoState(new RestTomatoState()); } } /** * @Description: 番茄-休息狀態(tà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: 客戶端 * @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)案例
這是一個簡單的電梯系統(tǒng)。電梯的狀態(tài)有關(guān)門、開門、上升、下降、停止。每個狀態(tài)下電梯的行為不同。通過狀態(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)門狀態(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("電梯門開了"); elevator.setCurrentState(elevator.getOpenState()); } @Override public void closeDoor() { System.out.println("電梯門已經(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: 開門狀態(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("電梯門已經(jīng)打開"); } @Override public void closeDoor() { System.out.println("電梯門關(guān)了"); elevator.setCurrentState(elevator.getCloseState()); } @Override public void moveUp() { System.out.println("電梯門打開狀態(tài),不能上升"); } @Override public void moveDown() { System.out.println("電梯門打開狀態(tài),不能下降"); } @Override public void stop() { System.out.println("電梯門打開狀態(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("電梯門開了"); elevator.setCurrentState(elevator.getOpenState()); } @Override public void closeDoor() { System.out.println("電梯門關(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("電梯正在上升,不能開門"); } @Override public void closeDoor() { System.out.println("電梯已經(jīng)關(guā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("電梯正在下降,不能開門"); } @Override public void closeDoor() { System.out.println("電梯正在下降,已經(jīng)關(guā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: 客戶端 * @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)門 elevator.closeDoor();//輸出 電梯門已經(jīng)關(guān)了 //開門 elevator.openDoor();//輸出 電梯門開了 //上升 elevator.moveUp();//輸出 電梯門打開狀態(tài)不能上升 //關(guān)門 elevator.closeDoor();//輸出 電梯門關(guān)了 //上升 elevator.moveUp();//輸出 電梯上升 //關(guān)門 elevator.closeDoor();//輸出 電梯已經(jīng)關(guān)門 //下降 elevator.moveDown();//輸出 電梯下降 //停止 elevator.stop();//輸出 電梯停止 //開門 elevator.openDoor();//輸出 電梯門開了 //停止 elevator.stop();//輸出 電梯門打開狀態(tài),不能變換為停止?fàn)顟B(tài) } }
到此這篇關(guān)于Java實現(xiàn)狀態(tài)模式的示例代碼的文章就介紹到這了,更多相關(guān)Java 狀態(tài)模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java Management Extensions管理擴展原理解析
這篇文章主要介紹了Java Management Extensions管理擴展原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-04-04使用Java?Executors創(chuàng)建線程池的9種方法
文章主要介紹了?Java?中Executors類創(chuàng)建線程池的?9?種方法,每種方法都詳細(xì)闡述了實現(xiàn)原理、源代碼分析、參數(shù)解釋、實現(xiàn)過程、特性和使用場景,感興趣的小伙伴跟著小編一起來看看吧2024-11-11Maven配置倉庫、阿里云鏡像、環(huán)境變量(史上最全)
本文主要介紹了Maven配置倉庫、阿里云鏡像、環(huán)境變量,文中通過圖文示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-07-07Springboot?RestTemplate設(shè)置超時時間的簡單方法
學(xué)習(xí)springboot ,RestTemplate的使用場景非常非常多,比如springcloud中的服務(wù)消費,下面這篇文章主要給大家介紹了關(guān)于Springboot?RestTemplate設(shè)置超時時間的簡單方法,需要的朋友可以參考下2022-01-01Java使用String.format方法格式化字符串的示例詳解
在編程過程中,我們經(jīng)常需要創(chuàng)建格式化的字符串來滿足特定的需求,比如生成用戶友好的消息、構(gòu)建報告或是輸出調(diào)試信息,Java 提供了一個強大的工具——String.format 方法,本文給大家介紹了Java使用String.format方法格式化字符串的示例,需要的朋友可以參考下2024-11-11Mybatis-Plus中updateById方法不能更新空值問題解決
本文主要介紹了Mybatis-Plus中updateById方法不能更新空值問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08IDEA 中創(chuàng)建Spring Data Jpa 項目的示例代碼
這篇文章主要介紹了IDEA 中創(chuàng)建Spring Data Jpa 項目的示例代碼,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04