Java實(shí)現(xiàn)狀態(tài)模式的示例代碼
一、簡(jiǎn)介
1、定義
狀態(tài)模式 (State Pattern)是一種行為型設(shè)計(jì)模式,允許對(duì)象在內(nèi)部狀態(tài)改變時(shí)改變它的行為。通過定義狀態(tài)接口和具體狀態(tài)類,將對(duì)象的狀態(tài)和行為分開,使得狀態(tài)改變時(shí)可以改變行為。
2、狀態(tài)模式的結(jié)構(gòu)
狀態(tài)模式涉及以下幾個(gè)角色:
State(狀態(tài)接口):定義了狀態(tài)類的共同接口,所有具體的狀態(tài)類都實(shí)現(xiàn)這個(gè)接口。
ConcreteState(具體狀態(tài)類):每個(gè)具體的狀態(tài)類實(shí)現(xiàn)了State接口,并定義了在該狀態(tài)下的具體行為。
Context(上下文):上下文類維護(hù)一個(gè)當(dāng)前狀態(tài)的引用,它通常會(huì)委托給具體的狀態(tài)類來執(zhí)行相應(yīng)的狀態(tài)切換。
二、Java實(shí)現(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)案例
這是一個(gè)簡(jiǎn)單的電梯系統(tǒng)。電梯的狀態(tài)有關(guān)門、開門、上升、下降、停止。每個(gè)狀態(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實(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)文章
SpringBoot Cookie & Session 用戶登錄及登
文章主要內(nèi)容介紹了會(huì)話跟蹤技術(shù),包括會(huì)話建立、結(jié)束、會(huì)話跟蹤定義以及客戶端和服務(wù)端會(huì)話跟蹤技術(shù)(如Cookie和Session令牌技術(shù)),文章詳細(xì)描述了Session的使用場(chǎng)景、工作原理、常用方法和認(rèn)證流程,感興趣的朋友一起看看吧2025-11-11
Java使用Condition實(shí)現(xiàn)精準(zhǔn)喚醒線程詳解
這篇文章主要為大家詳細(xì)介紹了Java如何使用Condition實(shí)現(xiàn)精準(zhǔn)喚醒線程效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下2023-02-02
SpringBoot中使用@Scheduled注解創(chuàng)建定時(shí)任務(wù)的實(shí)現(xiàn)
這篇文章主要介紹了SpringBoot中使用@Scheduled注解創(chuàng)建定時(shí)任務(wù)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
SpringBoot使用jasypt實(shí)現(xiàn)數(shù)據(jù)庫(kù)信息脫敏的方法詳解
這篇文章主要介紹了SpringBoot使用jasypt實(shí)現(xiàn)數(shù)據(jù)庫(kù)信息的脫敏,以此來保護(hù)數(shù)據(jù)庫(kù)的用戶名username和密碼password(容易上手,詳細(xì)),文中有詳細(xì)的圖文講解和代碼示例供大家參考,需要的朋友可以參考下2024-06-06
使用dom4j遞歸解析節(jié)點(diǎn)內(nèi)還含有多個(gè)節(jié)點(diǎn)的xml
這篇文章主要介紹了使用dom4j遞歸解析節(jié)點(diǎn)內(nèi)還含有多個(gè)節(jié)點(diǎn)的xml,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
Servlet+MyBatis項(xiàng)目轉(zhuǎn)Spring Cloud微服務(wù),多數(shù)據(jù)源配置修改建議
今天小編就為大家分享一篇關(guān)于Servlet+MyBatis項(xiàng)目轉(zhuǎn)Spring Cloud微服務(wù),多數(shù)據(jù)源配置修改建議,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-01-01

