Rumah >Java >javaTutorial >Bagaimana untuk melaksanakan mesin keadaan Java

Bagaimana untuk melaksanakan mesin keadaan Java

WBOY
WBOYke hadapan
2023-05-14 11:40:062634semak imbas

Andaikan kita mempunyai dua keadaan

Bagaimana untuk melaksanakan mesin keadaan Java

Peralihan keadaan ini sangat mudah, mari kita cuba laksanakannya dalam java

Struktur program adalah seperti berikut

Bagaimana untuk melaksanakan mesin keadaan Java

Mari kita perkenalkan dahulu representasi status

public class StateTransaction {
 
    // 当前状态
    private StateEnum currentState;
    // 相对应动作
    private ActionEnum action;
    // 下一个状态
    private StateEnum nextState;
    // 相应事件
    private Event event;
 
    public StateTransaction() {
 
    }
 
    public StateEnum getCurrentState() {
        return currentState;
    }
 
    public ActionEnum getAction() {
        return action;
    }
 
    public StateEnum getNextState() {
        return nextState;
    }
 
    public Event getEvent() {
        return event;
    }
 
    // 链式初始化对象
    public StateTransaction source(StateEnum state) {
        currentState = state;
        return this;
    }
    public StateTransaction when(ActionEnum action) {
        this.action = action;
        return this;
    }
    public StateTransaction target(StateEnum state) {
        nextState = state;
        return this;
    }
    public StateTransaction how(Event event) {
        this.event = event;
        return this;
    }
 
}

Seperti yang anda lihat, terdapat empat kuantiti yang mewakili status, iaitu:

  • currentState: mewakili keadaan semasa

  • tindakan: mewakili tindakan yang sepadan

  • nextState: mewakili keadaan seterusnya

  • Perhatikan empat kaedah pemulaan rantaian Takrifan empat kaedah ini menjadikan pemulaan keadaan sangat elegan.

    Mari kita lihat acara ialah antara muka acara khusus lain yang melaksanakan antara muka ini untuk melaksanakan operasi tertentu tanpa melakukan operasi yang rumit
  • public interface Event {
     
        public String handle();
     
    }
    public class PlayBasketballEvent implements Event{
        @Override
        public String handle() {
            System.out.println("开始打篮球");
            return "开始打篮球";
        }
    }
Selain itu, kita juga perlu menentukan dua kelas penghitungan untuk mewakili keadaan dan tindakan masing-masing

public class SingDanceRapEvent implements Event{
    @Override
    public String handle() {
        System.out.println("开始唱,跳,rap");
        return "开始唱,跳,rap";
    }
}

Selepas persediaan di atas selesai, kita memerlukan kelas mesin keadaan untuk melakukan pemindahan keadaan

public enum StateEnum {
    // 打篮球
    PLAY_BASKETBALL,
    // 唱跳rap
    SING_DANCE_RAP
}
public enum ActionEnum {
    // 音乐起
    MUSIC_ON,
    // 音乐结束
    MUSIC_OFF
}

Kod di atas mempunyai dua kaedah utama, iaitu addone() dan execute()

Mari kita bincangkan tentang addone() dahulu Kaedah ini mula-mula memulakan objek StateTransaction, kemudian meletakkannya dalam Senarai, dan akhirnya menambah objek ini Sekali kita dapat objek ini, kita boleh isi kandungannya.

Mari kita bercakap tentang execute(). Kaedah ini menerima ActionEnum sebagai parameter, dan kemudian merentasi senarai untuk mencari sekeping maklumat status objek seterusnya yang diperoleh dengan menukar status semasa melalui tindakan yang sepadan. Jika ditemui, laksanakan kaedah pemegang() dan pindahkan keadaan semasa, dan akhirnya kembalikan StateTransaction, jika tidak dijumpai, kembalikan nol.

Akhirnya mari kita lihat kaedah permulaan

public class StateMachine {
 
    // 存储状态信息
    private List<StateTransaction> stateTransactionList;
    // 记录当前状态
    private StateEnum currentState;
 
    public StateMachine(StateEnum state) {
        currentState = state;
        stateTransactionList = new ArrayList<>();
    }
 
    // 添加一条状态信息
    public StateTransaction addone() {
        StateTransaction stateTransaction = new StateTransaction();
        stateTransactionList.add(stateTransaction);
        return stateTransaction;
    }
 
    // 进行状态转移
    public StateTransaction execute(ActionEnum action) {
        for(int i=0; i<stateTransactionList.size(); i++) {
            if(currentState==stateTransactionList.get(i).getCurrentState() &&
                action==stateTransactionList.get(i).getAction()) {
                stateTransactionList.get(i).getEvent().handle();
                currentState = stateTransactionList.get(i).getNextState();
                return stateTransactionList.get(i);
            }
        }
        return null;
    }
 
}

Seperti yang anda lihat, kita boleh mencipta mesej pemindahan keadaan secara langsung menggunakan kaedah rantai, yang sangat elegan

Program output adalah seperti berikut

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan mesin keadaan Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam