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();
         }
     }
  • 相关阅读:
    WDA基础三:简单的INPUT选择,简单的TABLE显示
    WDA基础二:界面,元素介绍
    WDA基础一:激活相关服务
    docker in all
    神经网络理论与工程实战-知识积累
    信息论理论学习笔记
    机器学习数学知识积累总结
    互联网,IT,大数据,机器学习,AI知识tag云
    java web dev知识积累
    windows系统相关命令及问题排查实践
  • 原文地址:https://www.cnblogs.com/MalcolmMeng/p/8780342.html
Copyright © 2011-2022 走看看