状态模式:
状态模式跟策略结构一样,但是本质不一样;状态模式是平行的/不可替换的,策略模式的行为是彼此独立/可以替换的。
人有醒着和睡着两种状态;在这两种状态下可以做不同的事情。
//人状态接口
public interface Person {
public void eat();
public void coding();
public void snoring();
public void dreaming();
}
//人醒着做的事和睡着了做的事
public class PesonWake implements Person{
@Override
public void eat() {
System.out.println("吃饭");
}
@Override
public void coding() {
System.out.println("敲代码");
}
@Override
public void snoring() {
System.out.println("醒着打不了呼噜");
}
@Override
public void dreaming() {
System.out.println("醒着不做梦");
}
}
public class PersonSleep implements Person{
@Override
public void eat() {
System.out.println("睡着了不吃饭");
}
@Override
public void coding() {
System.out.println("睡着了不敲代码");
}
@Override
public void snoring() {
System.out.println("打呼噜");
}
@Override
public void dreaming() {
System.out.println("做梦");
}
}
//控制人状态接口
public interface PersonController {
public void wakeUp();
public void sleep();
}
//类似Context
public class PersonManagerController implements PersonController{
Person p;
public void setPersonStat(Person p){
this.p = p;
}
@Override
public void wakeUp() {
setPersonStat(new PesonWake());
System.out.println("醒着");
}
@Override
public void sleep() {
setPersonStat(new PersonSleep());
System.out.println("睡着了");
}
public void eat() {
p.eat();
}
public void coding() {
p.coding();
}
public void snoring() {
p.snoring();
}
public void dreaming() {
p.dreaming();
}
}
//Test 醒着只能做醒着的事 ,睡着只能做睡着的事
public static void main(String[] args) {
PersonManagerController pmc = new PersonManagerController();
pmc.wakeUp();
pmc.coding();
pmc.eat();
pmc.dreaming();
pmc.snoring();
pmc.sleep();
pmc.coding();
pmc.eat();
pmc.dreaming();
pmc.snoring();
}
运行结果:
醒着
敲代码
吃饭
醒着不做梦
醒着打不了呼噜
睡着了
睡着了不敲代码
睡着了不吃饭
做梦
打呼噜