欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java實(shí)現(xiàn)狀態(tài)模式的示例代碼

 更新時(shí)間:2025年02月11日 08:23:36   作者:new666999  
狀態(tài)模式是一種行為型設(shè)計(jì)模式,允許對(duì)象根據(jù)其內(nèi)部狀態(tài)改變行為,本文主要介紹了Java實(shí)現(xiàn)狀態(tài)模式的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

一、簡(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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java如何優(yōu)雅替換if-else語(yǔ)句

    Java如何優(yōu)雅替換if-else語(yǔ)句

    當(dāng)邏輯分支非常多的時(shí)候,if-else套了一層又一層,那么如何干掉過(guò)多的if-else,本文就詳細(xì)的介紹一下,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Java Management Extensions管理擴(kuò)展原理解析

    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創(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-11
  • Maven配置倉(cāng)庫(kù)、阿里云鏡像、環(huán)境變量(史上最全)

    Maven配置倉(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-07
  • SpringBoot整合gateway全過(guò)程

    SpringBoot整合gateway全過(guò)程

    這篇文章主要介紹了SpringBoot整合gateway全過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Springboot?RestTemplate設(shè)置超時(shí)時(shí)間的簡(jiǎn)單方法

    Springboot?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-01
  • Java使用String.format方法格式化字符串的示例詳解

    Java使用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-11
  • Mybatis-Plus中updateById方法不能更新空值問(wèn)題解決

    Mybatis-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-08
  • IDEA 中創(chuàng)建Spring Data Jpa 項(xiàng)目的示例代碼

    IDEA 中創(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
  • SpringMVC文件上傳的配置實(shí)例詳解

    SpringMVC文件上傳的配置實(shí)例詳解

    本文通過(guò)實(shí)例代碼給大家介紹SpringMVC文件上傳的配置相關(guān)內(nèi)容,本文介紹的非常詳細(xì),具有參考借鑒價(jià)值,感興趣的朋友一起學(xué)習(xí)吧
    2016-05-05

最新評(píng)論