13状态模式

图片来自head first 设计模式,仅供学习之用

每个状态都直接映射成一个类,每个类都实现state接口,state接口中含有可能发生的所有动作。

 状态机需要持有每一个状态的实例,并且要有一个状态变量来保存当前的状态

尝试使用状态模式来提取单词,下面就是代码。写完代码我发现状态模式要求状态的接口保持稳定,状态模式可以实现的是方便的增删状态,但不能修改动作。

package com.company;

 interface State{
     public String getLetter(String word, char c);
     public String getNumber(String word, char c);
     public String getOthers(String word, char c);
 }
 class Machine{
     private State startState;
     private State state1;
     private State state;
     private String target;
     public Machine(String target){
         startState=new StartState(this);
         state1=new State1(this);
         state=startState;
         this.target=target;
     }
     public void setState(State state) {
         this.state = state;
     }

     public State getStartState() {
         return startState;
     }

     public State getState1() {
         return state1;
     }
     public void run(){
         String word="";
         for (int i = 0; i <target.length() ; i++) {
             char c=target.charAt(i);
             if(Character.isLetter(c))word=state.getLetter(word,c);
             else if(Character.isDigit(c))word=state.getNumber(word,c);
             else word=state.getOthers(word,c);
         }
         System.out.println(word);
     }
 }
 class StartState implements State{
     private Machine machine;
     public StartState(Machine machine){
         this.machine=machine;
     }

     @Override
     public String getOthers(String word, char c) {
         return "";
     }

     @Override
     public String getLetter(String word, char c) {
        machine.setState(machine.getState1());
        word+=c;
        return word;
     }

     @Override
     public String getNumber(String word, char c) {
         return "";
     }
 }
 class  State1 implements State{
     private  Machine machine;
     public State1(Machine machine){
         this.machine=machine;
     }

     @Override
     public String getOthers(String word, char c) {
        machine.setState(machine.getStartState());
        System.out.println(word);
        return "";
     }

     @Override
     public String getLetter(String word, char c) {
         word+=c;
         return word;
     }

     @Override
     public String getNumber(String word, char c) {
         word+=c;
         return word;
     }
 }
 class StateTestDrive{
     public static void test(){
         String s=" class StartState implements State{
" +
                 "     private Machine machine;
" +
                 "     public StartState(Machine machine){
" +
                 "         this.machine=machine;
" +
                 "     }";
         Machine machine=new Machine(s);
         machine.run();
     }
 }
原文地址:https://www.cnblogs.com/MalcolmMeng/p/8780342.html