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 用戶登錄及登
文章主要內(nèi)容介紹了會話跟蹤技術(shù),包括會話建立、結(jié)束、會話跟蹤定義以及客戶端和服務端會話跟蹤技術(shù)(如Cookie和Session令牌技術(shù)),文章詳細描述了Session的使用場景、工作原理、常用方法和認證流程,感興趣的朋友一起看看吧2025-11-11
Java使用Condition實現(xiàn)精準喚醒線程詳解
這篇文章主要為大家詳細介紹了Java如何使用Condition實現(xiàn)精準喚醒線程效果,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起了解一下2023-02-02
SpringBoot中使用@Scheduled注解創(chuàng)建定時任務的實現(xiàn)
這篇文章主要介紹了SpringBoot中使用@Scheduled注解創(chuàng)建定時任務的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-06-06
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,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09
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

