1、状态模式
当对象的状态改变时,同时改变其行为。
如:QQ有几种在线状态,在线、隐身、忙碌等,每一个状态对应不同的操作,而且你的好友也能看到你的状态。
因此状态模式的核心思想:1:可以通过改变状态来获取不同的行为;2:你的好友能够同时看到你的变化;
适用性:
一个对象的行为取决于他的状态,并且他必须在运行时刻根据状态改变他的行为;
一个操作含有庞大的多分枝的条件语句,且这些分着依赖于该对象的状态。State模式将每一个条件分枝放入到一个独立的类中,
这使得你可以根据对象自身的情况将对象的状态作为一个对象,这一对象可以不依赖于其他对象而独立变化。
实例一
// 人状态类
public class PersonState {
// 人驾驶技术是否熟练
private boolean isSkilled;
public boolean isSkilled() {
return this.isSkilled;
}
public void setSkilled(final boolean isSkilled) {
this.isSkilled = isSkilled;
}
public void method1() {
System.out.println("~~技术熟练~~~");
}
public void method2() {
System.out.println("~~技术一般~~~");
}
}
// 道路状态类
public class RoadState {
// 道路是否畅通
private boolean isUnblocked;
public boolean isUnblocked() {
return this.isUnblocked;
}
public void setUnblocked(final boolean isUnblocked) {
this.isUnblocked = isUnblocked;
}
public void method1() {
System.out.println("~~道路畅通 ~~~");
}
public void method2() {
System.out.println("~~道路阻塞~~~");
}
}
// 状态模式的切换类
public class Context {
private PersonState person;
private RoadState road;
public Context(final PersonState person, final RoadState road) {
this.person = person;
this.road = road;
}
public void method() {
if (this.person.isSkilled()) {
this.person.method1();
}
else {
this.person.method2();
}
if (this.road.isUnblocked()) {
this.road.method1();
}
else {
this.road.method2();
}
if (this.person.isSkilled() || this.road.isUnblocked()) {
System.out.println("~~速度可以开到70码~~");
}
else {
System.out.println("~~建议速度开到40码~~");
}
}
public PersonState getPerson() {
return this.person;
}
public void setPerson(final PersonState person) {
this.person = person;
}
public RoadState getRoad() {
return this.road;
}
public void setRoad(final RoadState road) {
this.road = road;
}
}
模拟调用:
public static void main(final String[] args) {
final PersonState person = new PersonState();
final RoadState road = new RoadState();
// 初始状态
final Context context = new Context(person, road);
context.method();
// 状态改变
person.setSkilled(true);
context.method();
}