設(shè)計模式?狀態(tài)機(jī)模式

狀態(tài)模式把所研究的對象的行為包裝在不同的狀態(tài)對象里,每一個狀態(tài)對象都屬于一個抽象狀態(tài)類的一個子類。通過改變對象內(nèi)部的狀態(tài),使得你可以在運(yùn)行時動態(tài)改變一個對象的行為。

狀態(tài)模式的示意性類圖

首先我們設(shè)定一個奧特曼的接口

 interface Ultraman {

    void attackMonster();

    void shapeShift();

    void shooting();

    void usePower();
}

這個奧特曼有3種狀態(tài):

/**人類狀態(tài)**/
public class personState implements Ultraman {
    private Context context;


      personState(Context context){
        System.out.println("我是一個人 !!");
        this.context=context;
    }

    @Override
    public void attackMonster(){
        System.out.println("人類打不贏怪獸,快變身吧");

    }

    @Override
    public void shapeShift(){
        System.out.println("變成奧特曼了");
        context.setState(context.becomeUltraman());
    }

    @Override
    public void shooting(){
        System.out.println("射擊??!");

    }


    @Override
    public void usePower() {

    //do nothing
    }
   }

/**力量用完的狀態(tài)**/
class powerOffState implements Ultraman {
    private Context context;

    powerOffState(Context context) {
        this.context = context;

    }

    @Override
    public void attackMonster() {

    }

    @Override
    public void shapeShift() {
        System.out.println("變成人了");
        context.setState(context.becomePeople());
    }

    @Override
    public void shooting() {
        System.out.println("手太大,射擊技能不能使用");
    }


    @Override
    public void usePower() {
        System.out.println("能量用完了");
    }
}

/**正常奧特曼狀態(tài)**/
public class ultramanState implements Ultraman {
    private Context context;

    ultramanState(Context context) {
        this.context = context;
    }

    @Override
    public void attackMonster() {
        System.out.println("攻擊小怪獸");
        context.resultMonster();

    }

    @Override
    public void shapeShift() {
        System.out.println("變成人了");
        context.setState(context.becomePeople());
    }

    @Override
    public void shooting() {
        System.out.print("手太大,射擊技能不能使用");
    }


    @Override
    public void usePower() {
        System.out.println("消耗能量一顆");
    }

}

這是一個環(huán)境角色部分,定義用戶需要或者說感興趣的接口

public class Context {

    private Ultraman personState;
    private Ultraman powerOffState;
    private Ultraman ultramanState;
    private Ultraman ultraman;
    private int powerValue;


    public Context() {
        this.personState = new personState(this);
        this.powerOffState = new powerOffState(this);
        this.ultramanState = new ultramanState(this);
        this.ultraman = personState;
    }

    //設(shè)置當(dāng)前處于的狀態(tài)
     void setState(Ultraman ultraman) {

        this.ultraman = ultraman;
    }


    //變身  變身前初始化能量
    public void shapeShift(int powerValue) {
        this.powerValue = powerValue;
        ultraman.shapeShift();

    }

    //變成人
      Ultraman becomePeople() {
        return personState;
    }

    //變成怪獸
      Ultraman becomeUltraman() {

        return ultramanState;
    }

    //打怪獸的結(jié)果
     void resultMonster() {

        if (powerValue > 0) { //能量沒有用完
            ultraman.usePower();
            System.out.println("哈哈哈 恭喜擊敗小怪獸1只");
            powerValue--;
        } else {
            //能量用完轉(zhuǎn)化成能量用完狀態(tài)
            this.setState(powerOffState);
            ultraman.usePower();
            System.out.println("你被小怪獸擊敗了");

        }
    }


    //攻擊怪獸
    public void battle() {
        ultraman.attackMonster();

    }

    //射擊
    public void shooting() {
        ultraman.shooting();
    }


}

實際調(diào)用部分

public class battleTest {
    public static  void  main(String[] args){
         int powerValue=1;              //初始化奧特曼的能量為5
        Context context=new Context();
        System.out.println("怪獸出現(xiàn)了0口0");
        context.shooting();             //人類可以射擊
        context.battle();             //人類可以射擊
        context.shapeShift(powerValue); //射擊不成功,變身
        for(int i=0;i<1;i++){           //出現(xiàn)了四只怪獸,打敗了所有怪獸
        context.battle();
        }
        context.shapeShift(powerValue);  //打完怪獸,變回人
        context.shooting();              //人類可以射擊
        context.shapeShift(powerValue);   //又變成怪獸
        for(int i=0;i<2;i++){             //出現(xiàn)了六只怪獸,被打敗
            context.battle();
        }
    }

}

和策略模式存在的區(qū)別:【自己切換和主動切換】
狀態(tài)模式將各個狀態(tài)所對應(yīng)的操作分離開來,即對于不同的狀態(tài),由不同的子類實現(xiàn)具體操作,不同狀態(tài)的切換由子類實現(xiàn),當(dāng)發(fā)現(xiàn)傳入?yún)?shù)不是自己這個狀態(tài)所對應(yīng)的參數(shù),則自己給Context類切換狀態(tài);而策略模式是直接依賴注入到Context類的參數(shù)進(jìn)行選擇策略,不存在切換狀態(tài)的操作練習(xí)。

在jdk里的應(yīng)用:

java.util.Iterator
javax.faces.lifecycle.LifeCycle#execute()

參考:http://blog.csdn.net/seacean2000/article/details/10528153

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,715評論 19 139
  • 《JavaScript設(shè)計模式與開發(fā)實踐》作者:曾探 系統(tǒng)的介紹了各種模式,以及js中的實現(xiàn)、應(yīng)用,以及超大量高質(zhì)...
    undefinedR閱讀 897評論 0 10
  • 設(shè)計模式匯總 一、基礎(chǔ)知識 1. 設(shè)計模式概述 定義:設(shè)計模式(Design Pattern)是一套被反復(fù)使用、多...
    MinoyJet閱讀 4,098評論 1 15
  • 設(shè)計模式基本原則 開放-封閉原則(OCP),是說軟件實體(類、模塊、函數(shù)等等)應(yīng)該可以拓展,但是不可修改。開-閉原...
    西山薄涼閱讀 4,086評論 3 14
  • 在所有過去和將來,所有值得懷念與值得期待的景色里,依然還是你。 賦詩一首,情懷依舊: 《在蟬鳴的夏夜》 我左手提瓜...
    春風(fēng)小小僧閱讀 306評論 1 1

友情鏈接更多精彩內(nèi)容