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

设计套路-状态套路

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

    相关文章

      网友评论

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

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