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

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

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

一、簡介

1、定義

狀態(tài)模式 (State Pattern)是一種行為型設計模式,允許對象在內(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(上下文):上下文類維護一個當前狀態(tài)的引用,它通常會委托給具體的狀態(tài)類來執(zhí)行相應的狀態(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),不能變換為停止狀態(tài)");
    }
}

/**
 * @Description: 停止狀態(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;// 默認初始狀態(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),不能變換為停止狀態(tài)
    }
}

到此這篇關(guān)于Java實現(xiàn)狀態(tài)模式的示例代碼的文章就介紹到這了,更多相關(guān)Java 狀態(tài)模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot  Cookie & Session 用戶登錄及登錄狀態(tài)保持功能實現(xiàn)代碼

    SpringBoot  Cookie & Session 用戶登錄及登

    文章主要內(nèi)容介紹了會話跟蹤技術(shù),包括會話建立、結(jié)束、會話跟蹤定義以及客戶端和服務端會話跟蹤技術(shù)(如Cookie和Session令牌技術(shù)),文章詳細描述了Session的使用場景、工作原理、常用方法和認證流程,感興趣的朋友一起看看吧
    2025-11-11
  • Java使用Condition實現(xiàn)精準喚醒線程詳解

    Java使用Condition實現(xiàn)精準喚醒線程詳解

    這篇文章主要為大家詳細介紹了Java如何使用Condition實現(xiàn)精準喚醒線程效果,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-02-02
  • SpringBoot中使用@Scheduled注解創(chuàng)建定時任務的實現(xiàn)

    SpringBoot中使用@Scheduled注解創(chuàng)建定時任務的實現(xiàn)

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

    淺析Spring的JdbcTemplate方法

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

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

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

    SpringBoot使用jasypt實現(xiàn)數(shù)據(jù)庫信息脫敏的方法詳解

    這篇文章主要介紹了SpringBoot使用jasypt實現(xiàn)數(shù)據(jù)庫信息的脫敏,以此來保護數(shù)據(jù)庫的用戶名username和密碼password(容易上手,詳細),文中有詳細的圖文講解和代碼示例供大家參考,需要的朋友可以參考下
    2024-06-06
  • 使用dom4j遞歸解析節(jié)點內(nèi)還含有多個節(jié)點的xml

    使用dom4j遞歸解析節(jié)點內(nèi)還含有多個節(jié)點的xml

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

    Java  Object類中的常用API介紹

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

    Servlet+MyBatis項目轉(zhuǎn)Spring Cloud微服務,多數(shù)據(jù)源配置修改建議

    今天小編就為大家分享一篇關(guān)于Servlet+MyBatis項目轉(zhuǎn)Spring Cloud微服務,多數(shù)據(jù)源配置修改建議,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • Spring Cloud Feign原理詳解

    Spring Cloud Feign原理詳解

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

最新評論

柞水县| 商河县| 海晏县| 曲沃县| 临邑县| 罗源县| 阿克陶县| 南陵县| 禹州市| 珲春市| 麻栗坡县| 会泽县| 通海县| 兴山县| 龙江县| 双江| 广平县| 云阳县| 邵武市| 庆元县| 阳城县| 岳池县| 桐庐县| 大港区| 祁东县| 克拉玛依市| 万荣县| 津市市| 五大连池市| 闽侯县| 台南县| 四会市| 竹北市| 莒南县| 青海省| 南宁市| 霍城县| 黄骅市| 龙井市| 孟津县| 云南省|