• 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();
         }
     }
  • 相关阅读:
    提交一个spark程序及spark执行器
    前端如何让服务器主动向浏览器推送数据
    h5页面移动端iPhoneX适配方法
    详说tcp粘包和半包
    mysql配置文件 /etc/my.cnf 详细解释
    【todo】MVCC原理及与锁之间的关系
    【todo】innodb表锁的底层实现原理
    【todo】innodb行锁的底层实现原理
    【todo】mysql binlog
    [todo] spring 事务的传播性
  • 原文地址:https://www.cnblogs.com/MalcolmMeng/p/8780342.html
Copyright © 2020-2023  润新知