美文网首页设计模式
java 状态模式 获取中国古代年龄称谓

java 状态模式 获取中国古代年龄称谓

作者: 饱饱想要灵感 | 来源:发表于2022-08-01 20:48 被阅读0次

    利用状态模式可以跳出无限 if-else 语句块的陷阱, 避免代码臃肿.

    以获取中国古代年龄称谓为例, 正常书写if-else会有十几个判断条件, 代码难读又丑陋. 而使用状态模式, 则转变为十几个类, 每个类都只做一次判断, 且面向接口编程, 显得更优雅.

    实现方法

    1. 定义一个接口
    public interface ChineseAge {
        String compute(User user);
    }
    
    1. 每一个分支条件都要实现该接口, 补充具体逻辑, 以下是第一个分支
    public class ChiziAge implements ChineseAge {
        @Override
        public String compute(User user) {
            // if 写当前判断, else转入下一个判断, 使用关键字return
            if (user.getAge() >= 0 && user.getAge() < 3) {
                return "赤子";
            } else {
                return new ChuitiaoAge().compute(user);
            }
        }
    }
    
    1. 调用者初始化时, 直接进入第一个分支条件
    public class ChineseAgeExecutor {
        private final ChineseAge chineseAge;
    
        public ChineseAgeExecutor() {
            chineseAge = new ChiziAge();
        }
    
        public String getChineseAge(User user){
            return chineseAge.compute(user);
        }
    }
    
    1. 附上其他年龄段的代码
    public class ChuitiaoAge implements ChineseAge {
        @Override
        public String compute(User user) {
            if (user.getAge() >= 3 && user.getAge() < 8) {
                return "垂髫";
            } else {
                return new ZongjiaoAge().compute(user);
            }
        }
    }
    
    public class ZongjiaoAge implements ChineseAge {
        @Override
        public String compute(User user) {
            if (user.getAge() >= 8 && user.getAge() < 13) {
                return "总角";
            } else {
                return new DoukouAge().compute(user);
            }
        }
    }
    
    public class DoukouAge implements ChineseAge {
        @Override
        public String compute(User user) {
            if (user.getAge() >= 13 && user.getAge() < 15) {
                if (user.getSex().equals("女")) {
                    return "豆蔻";
                } else {
                    return "总角";
                }
            } else {
                return new ShufaAge().compute(user);
            }
        }
    }
    
    public class ShufaAge implements ChineseAge {
        @Override
        public String compute(User user) {
            if (user.getAge() >= 15 && user.getAge() < 20) {
                if (user.getSex().equals("女")) {
                    return "及䈂";
                } else {
                    return "束发";
                }
            } else {
                return new RuoguanAge().compute(user);
            }
        }
    }
    
    public class RuoguanAge implements ChineseAge{
        @Override
        public String compute(User user) {
            if (user.getAge() >= 20 && user.getAge() < 30) {
                if (user.getSex().equals("女")) {
                    return "双十";
                } else {
                    return "弱冠";
                }
            } else {
                return new ErliAge().compute(user);
            }
        }
    }
    

    相关文章

      网友评论

        本文标题:java 状态模式 获取中国古代年龄称谓

        本文链接:https://www.haomeiwen.com/subject/xwsmmrtx.html