美文网首页
设计套路-状态套路

设计套路-状态套路

作者: 深爱蒲公英的纯美 | 来源:发表于2018-08-01 14:22 被阅读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判断,而且每种状态对应的行为都是一个个具体的类,这些耦合很低,代码便于管理。状态模式和策略模式看起来很像,但是它们本身对应的场景不一样,这个可以从定义种慢慢体会。

相关文章

  • 设计套路-状态套路

    定义 当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。 使用场景 一个状态的行为取决于它的...

  • 设计套路-策略套路

    定义 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换,策略模式让算法独立于使用它的客...

  • 喜剧套路·角色设计篇

    喜剧套路·角色设计篇——同类相遇 和尚斗光头, 肥仔泡胖妞。 骗子骗骗子, 小偷偷小偷。 喜剧套路·角色设计篇——...

  • 学习套路设计(三)

    学习套路设计(一)| 进度条——解决学习拖延症 和 学习套路设计(二)| 奖励与损失厌恶——解决学习拖延症 分析了...

  • 设计套路-责任链套路

    定义 使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合,将这些对象连成一条链,并沿着这条链传递...

  • vue3嵌套路由(后台管理系统)

    如何设计一个后台管理系统的路由呢?这里就需要使用到嵌套路由。 嵌套路由 带children的嵌套路由可以有页面,也...

  • 算法6:设计中常用的武器-栈

    算法就是设计,而设计无处不在,故算法无处不在,但这是废话,关键还是,要把握设计的套路,如果能发明套路就更不得了。设...

  • javascript常用设计模式

    什么是设计模式 简单点回答: 就是开发的套路,自古套路得人心,套路用的好了,被人们总结出来形成了一种思想模式就简称...

  • 装饰品

    套路的里面是套路套路的外面是套路 真相不过是套路的装饰

  • PHP设计模式

    打算复习下设计模式,就有了这个文集。 所谓设计模式,就是代码编程里面的一种套路,解决某类问题形成的套路模式,就好比...

网友评论

      本文标题:设计套路-状态套路

      本文链接:https://www.haomeiwen.com/subject/hkplvftx.html