zoukankan      html  css  js  c++  java
  • 状态模式

    1. 定义

    状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。

    2. 类图

    3. Example

    下面定义了一个State接口,接口里有个meaningOfLife的方法,定义了出生、三十、四十、五十、顿悟的几种状态。

    人的主体PersonContext成员变量有State和感受(feeling)方法,测试代码中setAge来模拟人生阶段的变化,两次调用feeling略显不合理。。。

    package com.gitlearning.hanldegit.patterns.state;
    
    
    public interface State {
        void meaningOfLife(PersonContext personContext);
    }
    
    class Born implements State {
    
        @Override
        public void meaningOfLife(PersonContext personContext) {
            if (personContext.getAge() == 0) {
    
                System.out.println("Cry...");
            } else {
                personContext.setState(new Thirty());
            }
        }
    }
    
    class Thirty implements State {
    
        @Override
        public void meaningOfLife(PersonContext personContext) {
            if (personContext.getAge() <= 30) {
    
                System.out.println("三十而立");
            } else {
                personContext.setState(new Fourty());
            }
        }
    }
    
    
    class Fourty implements State {
    
        @Override
        public void meaningOfLife(PersonContext personContext) {
            if (personContext.getAge() <= 40) {
                System.out.println("四十而不惑");
            } else {
                personContext.setState(new Fifty());
            }
        }
    }
    
    
    class Fifty implements  State {
    
        @Override
        public void meaningOfLife(PersonContext personContext) {
            if (personContext.getAge() <= 50) {
                System.out.println("五十而知天命");
            } else {
                personContext.setState(new Hit());
            }
        }
    }
    
    class Hit implements State {
    
        @Override
        public void meaningOfLife(PersonContext personContext) {
            System.out.println("处世若大梦,胡为劳其生");
        }
    }
    
    
    package com.gitlearning.hanldegit.patterns.state;
    
    import lombok.Data;
    
    @Data
    public class PersonContext {
        // 人生状态
        State state;
        int age;
    
        public void feeling() {
            state.meaningOfLife(this);
        }
    
        public void setAge(int age) {
            this.age = age;
            // 这里纯粹是为了改变一下状态
            feeling();
        }
    
        public PersonContext() {
            state = new Born();
        }
    }
    
    
    class Test {
        public static void main(String[] args) {
            PersonContext personContext = new PersonContext();
            personContext.feeling();
            personContext.setAge(30);
            personContext.feeling();
            personContext.setAge(40);
            personContext.feeling();
            personContext.setAge(50);
            personContext.feeling();
            personContext.setAge(60);
            personContext.feeling();
        }
    }
    
    

    输出:

    Cry...
    三十而立
    四十而不惑
    五十而知天命
    处世若大梦,胡为劳其生
    
    当你准备好了,机会来临的时候,你才能抓住
  • 相关阅读:
    没有完成的题目
    哈尔滨工程大学 ACM online contest 1008 how many
    POJ 2976 分数规划
    长沙理工 ACM 数位 DP 1488
    POJ 2663
    USETC 1821 AC 自动机
    长沙理工 ACM 分数规划 1494
    正则表达式基础知识(转)
    上传头像代码
    datalist 分页(转)
  • 原文地址:https://www.cnblogs.com/studentytj/p/12514195.html
Copyright © 2011-2022 走看看