设计套路-状态套路

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判断,而且每种状态对应的行为都是一个个具体的类,这些耦合很低,代码便于管理。状态模式和策略模式看起来很像,但是它们本身对应的场景不一样,这个可以从定义种慢慢体会。

上一篇下一篇

猜你喜欢

热点阅读