创建一个Hero类,有一个方法work可以根据当前实例的体力(power)和是否过于疲倦(isTired)来做出不同的反应:
public class Main {
public static void main(String[] args) {
Hero hero = new Hero(100, false);
hero.work();
hero.setPower(75);
hero.work();
hero.setPower(50);
hero.work();
hero.setPower(25);
hero.work();
hero.setPower(0);
hero.work();
hero.setTired(true);
hero.work();
}
}
class Hero {
private int power;
private boolean isTired;
public Hero(int power, boolean isTired) {
this.power = power;
this.isTired = isTired;
}
public void work() {
if (power > 75){
System.out.println("power:" +power+ " 精力充沛地干活");
}
else if (power > 50){
System.out.println("power:" +power+ " 不慌不忙地干活");
}
else if (power > 25){
System.out.println("power:" +power+ " 疲惫不堪地干活");
}
else {
if (!isTired){
if (power > 0){
System.out.println("power:" +power+ " 极度疲劳地干活");
}
else {
System.out.println("power:" +power+ " 体力透支,晕倒了");
}
}
else {
System.out.println("power:" +power+ " 太累,不干了");
}
}
}
public int getPower() {
return power;
}
public void setPower(int power) {
this.power = power;
}
public boolean isTired() {
return isTired;
}
public void setTired(boolean tired) {
isTired = tired;
}
}
运行结果:
power:100 精力充沛地干活
power:75 不慌不忙地干活
power:50 疲惫不堪地干活
power:25 极度疲劳地干活
power:0 体力透支,晕倒了
power:0 太累,不干了
可以看到代码中有较多的if-else判断,意味着这个方法的责任过大,如果改动或添加分支,都需要在这个方法上改,维护出错的风险增大,违背了单一职责原则、开闭原则。
我们可以用状态模式来改良这个设计:
public class Main {
public static void main(String[] args) {
Hero hero = new Hero(100, false);
hero.work();
hero.setPower(75);
hero.work();
hero.setPower(50);
hero.work();
hero.setPower(25);
hero.work();
hero.setPower(0);
hero.work();
hero.setTired(true);
hero.work();
}
}
//抽象状态接口
interface IState {
void work(Hero hero);
}
class HappyWork implements IState{
@Override
public void work(Hero hero) {
if (hero.getPower() > 75){
System.out.println("power:" +hero.getPower()+ " 精力充沛地干活");
}
else {
hero.setCurState(new NormalWork());
hero.work();
}
}
}
class NormalWork implements IState{
@Override
public void work(Hero hero) {
if (hero.getPower() > 50){
System.out.println("power:" +hero.getPower()+ " 不慌不忙地干活");
}
else {
hero.setCurState(new TiredWork());
hero.work();
}
}
}
class TiredWork implements IState{
@Override
public void work(Hero hero) {
if (hero.getPower() > 25){
System.out.println("power:" +hero.getPower()+ " 疲惫不堪地干活");
}
else {
hero.setCurState(new VeryTiredWork());
hero.work();
}
}
}
class VeryTiredWork implements IState{
@Override
public void work(Hero hero) {
if (!hero.isTired()){
if (hero.getPower() > 0){
System.out.println("power:" +hero.getPower()+ " 极度疲劳地干活");
}
else {
hero.setCurState(new SleepWork());
hero.work();
}
}
else {
hero.setCurState(new NoPowerWork());
hero.work();
}
}
}
class SleepWork implements IState{
@Override
public void work(Hero hero) {
if (hero.isTired()) {
hero.setCurState(new NoPowerWork());
hero.work();
}
else {
System.out.println("power:" +hero.getPower()+ " 体力透支,晕倒了");
}
}
}
class NoPowerWork implements IState{
@Override
public void work(Hero hero) {
System.out.println("power:" +hero.getPower()+ " 太累,不干了");
}
}
class Hero {
//这里增加一个当前状态的引用
private IState curState;
private int power;
private boolean isTired;
public Hero(int power, boolean isTired) {
this.power = power;
this.isTired = isTired;
this.curState = new HappyWork();
}
public void work() {
this.curState.work(this);
}
public int getPower() {
return power;
}
public void setPower(int power) {
this.power = power;
}
public boolean isTired() {
return isTired;
}
public void setTired(boolean tired) {
isTired = tired;
}
public IState getCurState() {
return curState;
}
public void setCurState(IState curState) {
this.curState = curState;
}
}
运行结果:power:100 精力充沛地干活
power:75 不慌不忙地干活
power:50 疲惫不堪地干活
power:25 极度疲劳地干活
power:0 体力透支,晕倒了
power:0 太累,不干了