zoukankan      html  css  js  c++  java
  • 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();
         }
     }
  • 相关阅读:
    基于element-ui图片封装组件
    计算时间间隔具体每一天
    C语言学习笔记 —— 函数作为参数
    AtCoder Beginner Contest 049 题解
    AtCoder Beginner Contest 048 题解
    AtCoder Beginner Contest 047 题解
    AtCoder Beginner Contest 046 题解
    AtCoder Beginner Contest 045 题解
    AtCoder Beginner Contest 044 题解
    AtCoder Beginner Contest 043 题解
  • 原文地址:https://www.cnblogs.com/MalcolmMeng/p/8780342.html
Copyright © 2011-2022 走看看