狀態模式

前言

狀態模式也是行爲型設計模式,設計的初衷是應對同一個對象裏不一樣狀態變化時的不一樣行爲的變化。設計模式

目錄

1、定義

當一個對象內在狀態改變時容許其改變行爲,這個對象看起來像改變了其類。簡單點來講,就是經過定義一個狀態變量,經過這個狀態變量,控制自身行爲。markdown

2、模式原理分析

咱們模擬電梯開門、關門的例子ide

//1.抽象電梯狀態
public abstract class LiftState{
    //定義一個角色,封裝了狀態變化角色
    protected Context context;
    public void setContext(Context _context){
        this.context = _context;
    }
    //電梯門開啓
    public abstract void open();
    //電梯門關閉
    public abstract void close();
    //電梯門運行
    public abstract void run();
    //電梯門停下來
    public abstract void stop();
}
//2.上下文  各類狀態
public class Context{
    public final static ClosingState closeingState = new ClosingState();
    public final static RunningState runningState = new RunningState();
    public final static StoppingState stoppingState = new StoppingState();
    
    //定義一個當前電梯狀態
    private LiftSate liftState;
    public LiftState getLiftState(){
        return liftState;
    }
    public void setLiftState(LiftState liftState){
        this.liftState = listState;
        this.liftState.setContext(this);
    }
    public void open(){
        this.liftState.open();
    }
    public void close(){
        this.liftState.close();
    }
    public void run(){
        this.liftState.run();
    }
    public void stop(){
        this.liftState.stop();
    }
}
//3.開門狀態
public class OpenngingState extends LiftState{
    @Override
    public void close(){
        //狀態修改
        super.context.setLifeState(Context.closeingState);
        //委託給CloseState來執行
        super.context.getLiftState().close();
    }
    @Override
    public void open(){
        System.out.println("電梯門開啓");
    }
    @Override
    public void run(){
        //電梯運行
    }
    @Override
    public void stop(){
        //電梯中止
    }
}
//4.關閉狀態
public class OpenngingState extends LiftState{
    @Override
    public void close(){
     	System.out.println("電梯門關門");
        
    }
    @Override
    public void open(){
       //狀態修改
        super.context.setLifeState(Context.openningState);
        super.context.getLiftState().open();
    }
    @Override
    public void run(){
        super.context.setLifeState(Context.runingState);
        super.context.getLiftState().run();
    }
    @Override
    public void stop(){
        super.context.setLifeState(Context.stoppingState);
        super.context.getLiftState().stop();
    }
}
//5.運行狀態
public class RunningState extends LifeState{
    @Override
    public void close(){
        
    }
    @Override
    public void open(){
     
    }
    @Override
    public void run(){
        System.out.println("電梯上下運行");
    }
    @Override
    public void stop(){
        super.context.setLifeState(Context.stoppingState);
        super.context.getLiftState().stop();
    }
}
//6.中止狀態
public class RunningState extends LifeState{
    @Override
    public void close(){
        
    }
    @Override
    public void open(){
        super.context.setLifeState(Context.openningState);
        super.context.getLiftState().open();
    }
    @Override
    public void run(){
        super.context.setLifeState(Context.runningState);
        super.context.getLiftState().run();
    }
    @Override
    public void stop(){
        System.out.println("電梯中止運行了,到樓層了");
    }
}
//7.場景類
public class Client{
    public static void main(String[] args){
        Context context = new Context();
        context.setLiftState(new CloseingState());
        context.open();
        context.close();
        context.run();
        context.stop();
    }
}
複製代碼

3、使用場景

  • 行爲隨狀態改變而改變的場景,如購物訂單變化、電梯運行狀態this

  • 條件、分支判斷語句的替代者spa

4、優勢

  • 避免大量的if-else語句,結構清晰設計

  • 快速理解狀態和行爲之間的關係code

  • 遵循設計原則,每一個狀態都是一個子類,新增和修改都是針對子類,體現了單一職責原則orm

5、缺點

  • 不少狀態就會有不少子類,形成不少零散類,對象

  • 狀態切換關係複雜,每一個狀態間的關係須要很好的理解,維護成本增長get

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息