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...
    三十而立
    四十而不惑
    五十而知天命
    处世若大梦,胡为劳其生
    
    当你准备好了,机会来临的时候,你才能抓住
  • 相关阅读:
    学习python第二天数据库day1
    学习python第一天总纲
    Mac 键盘快捷键
    报错 Filtered offsite request
    mysql 顺序问题
    implode 把数组 组成一个字符串
    TP view中跳转到某个控制器
    生成商品的唯一货号
    数组排序
    判断文件是否存在 删除文件
  • 原文地址:https://www.cnblogs.com/studentytj/p/12514195.html
Copyright © 2011-2022 走看看