最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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)模式的示例代碼,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

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

相關(guān)文章

  • SpringBoot  Cookie & Session 用戶登錄及登錄狀態(tài)保持功能實(shí)現(xià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)喚醒線程詳解

    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)

    這篇文章主要介紹了SpringBoot中使用@Scheduled注解創(chuàng)建定時(shí)任務(wù)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • 淺析Spring的JdbcTemplate方法

    淺析Spring的JdbcTemplate方法

    本篇淺析Spring的JdbcTemplate方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-01-01
  • Java編寫查看調(diào)用棧信息的工具類

    Java編寫查看調(diào)用棧信息的工具類

    大家在開發(fā)項(xiàng)目的過程中,應(yīng)該經(jīng)常會(huì)需要分析調(diào)用棧信息,所以這里本文主要來和大家分享一個(gè)調(diào)用棧打印的Java工具類,希望對(duì)大家有所幫助
    2025-08-08
  • SpringBoot使用jasypt實(shí)現(xiàn)數(shù)據(jù)庫(kù)信息脫敏的方法詳解

    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

    這篇文章主要介紹了使用dom4j遞歸解析節(jié)點(diǎn)內(nèi)還含有多個(gè)節(jié)點(diǎn)的xml,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java  Object類中的常用API介紹

    Java  Object類中的常用API介紹

    這篇文章主要介紹了Java  Object類中的常用API介紹,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-11-11
  • Servlet+MyBatis項(xiàng)目轉(zhuǎn)Spring Cloud微服務(wù),多數(shù)據(jù)源配置修改建議

    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
  • Spring Cloud Feign原理詳解

    Spring Cloud Feign原理詳解

    Feign 主要是幫助我們方便進(jìn)行rest api服務(wù)間的調(diào)用,本文從Spring Cloud對(duì)feign封裝的源碼中去了解其主要實(shí)現(xiàn)機(jī)制
    2021-06-06

最新評(píng)論

霍邱县| 会昌县| 中阳县| 宁夏| 古交市| 德钦县| 通渭县| 沙洋县| 黔东| 靖江市| 云阳县| 定日县| 海兴县| 西青区| 泸西县| 麻栗坡县| 仪陇县| 楚雄市| 沅江市| 青冈县| 辽宁省| 伊宁市| 武宣县| 屏南县| 五原县| 沾益县| 湖南省| 伊春市| 共和县| 漳平市| 高雄县| 荆门市| 瓮安县| 长宁区| 托克逊县| 伊吾县| 仁布县| 虹口区| 安宁市| 黄石市| 凉山|