利用状态模式可以跳出无限 if-else 语句块的陷阱, 避免代码臃肿.
以获取中国古代年龄称谓为例, 正常书写if-else
会有十几个判断条件, 代码难读又丑陋. 而使用状态模式, 则转变为十几个类, 每个类都只做一次判断, 且面向接口编程, 显得更优雅.
实现方法
- 定义一个接口
public interface ChineseAge {
String compute(User user);
}
- 每一个分支条件都要实现该接口, 补充具体逻辑, 以下是第一个分支
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);
}
}
}
- 调用者初始化时, 直接进入第一个分支条件
public class ChineseAgeExecutor {
private final ChineseAge chineseAge;
public ChineseAgeExecutor() {
chineseAge = new ChiziAge();
}
public String getChineseAge(User user){
return chineseAge.compute(user);
}
}
- 附上其他年龄段的代码
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);
}
}
}
网友评论