设计套路-状态套路
2018-08-01 本文已影响0人
深爱蒲公英的纯美
定义
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
使用场景
- 一个状态的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为。
- 代码中包含大量与对象状态有关的条件语句。
优点
State模式将所有与一个特定的状态相关的行为都放入一个状态对象中,它提供了一个更好的方法来组织与特定状态相关的代码,将繁琐的状态判断转换成结构清晰的状态类族,在避免代码膨胀的同时也保证了可扩展性与可维护性。
缺点
- 状态模式的使用必然会增加系统类和对象的个数。
相关类
状态行为的顶级接口,具体状态的实现类
状态的顶级接口,状态操作的实现类。
生活实例
在上一出我们说了王二麻子去找朋友,希望能解决登记土地这个事情,在去的路上,王二麻子就想了如果朋友可以把事情办成,那么就回家,顺便去看一下另一个朋友,如果办不成那么就得找其他人帮忙,也不去看朋友了。
在这个过程中,结果有两种状态,一种是事情办成了,一种是没有办成,而这两种不同的结果导致了王二麻子接下来两种不同的行为。
我们先看一下一般实现:
public class NormalOperate {
public static final int SUCCESS = 1;
public static final int fIAL = 2;
public void leave(int status){
if (status == 1){
System.out.print("ok了,回家等消息!");
}else if (status == 2){
System.out.print("去找另一个朋en友吧!");
}
}
public void visitFrid(int status){
if (status == 1){
System.out.print("去看望");
}else if (status == 2){
System.out.print("不去了");
}
}
}
很简单,就是定义结果类型,然后每一个行为都通过if或者swich判断状态。这样做很明显如果有其他状态那么会有更多的if判断,类结构更加复杂。
接下来我们用状态套路实现:
状态行为的顶级接口:
public interface Status {
void leave(); //离开
void visitFriend(); //看望朋友
}
具体状态实现类:
public class SuccessStatus implements Status{
@Override
public void leave() {
System.out.print("ok了,回家等消息!");
}
@Override
public void visitFriend() {
System.out.print("去看望");
}
}
public class FailStatus implements Status {
@Override
public void leave() {
System.out.print("去找另一个朋友吧!");
}
@Override
public void visitFriend() {
System.out.print("不去了");
}
}
状态的顶级接口:
public interface StatusControl {
void success(Status status);
void fail(Status status);
}
状态顶级接口实现类:
public class WangControl implements StatusControl {
private Status status;
public void setStatus(Status status) {
this.status = status;
}
@Override
public void success(Status status) {
setStatus(status);
System.out.print("办成了")
}
@Override
public void fail(Status status) {
setStatus(status);
System.out.print("没办成")
}
public void leave() {
status.leave();
}
public void visitFriend() {
status.visitFriend();
}
}
测试类:
public class MyClass {
public static void main(String[] args) {
WangControl wangControl = new WangControl();
wangControl.setStatus(new SuccessStatus());
wangControl.leave();
wangControl.visitFriend();
}
}
这里很明显不管有多少种状态我们都不用繁琐的去用if判断,而且每种状态对应的行为都是一个个具体的类,这些耦合很低,代码便于管理。状态模式和策略模式看起来很像,但是它们本身对应的场景不一样,这个可以从定义种慢慢体会。