状态模式——省去if-else的繁琐结构

本文介绍状态模式的概念及其实现方式,通过定义状态接口和功能接口,实现了不同状态下功能的不同表现,并展示了如何通过设置状态来改变对象的行为,从而避免复杂的条件判断语句。

一句话描述状态模式
定义功能接口,不同状态下的功能实现,定义状态接口,在controller中通过setState来实现后续不同行为的产生。



功能接口

public interface Function {

    void drive();

    void run();

    void back();

}

功能实现接口1

public class OffLineState implements Function {
    @Override
    public void drive() {
        System.out.print("不在线的drive");
    }

    @Override
    public void run() {
        System.out.print("不在线的run");
    }

    @Override
    public void back() {
        System.out.print("不在线的back");
    }
}

功能实现接口2

public class OnLineState implements Function {
    @Override
    public void drive() {
        System.out.print("在线的drive");
    }

    @Override
    public void run() {
        System.out.print("在线的run");
    }

    @Override
    public void back() {
        System.out.print("在线的back");
    }
}

状态接口

public interface State {

    void offLine();
    void onLine();
}

Controller

public class StateController implements State {

    Function func;

    public void setstate(Function c) {
        this.func = c;
    }


    @Override
    public void offLine() {
        //设置不同的状态
        setstate(new OffLineState());
    }

    @Override
    public void onLine() {
         //设置不同的状态
        setstate(new OnLineState());
    }

    public void drive() {
        func.drive();
    }

    public void run() {
        func.run();
    }

    public void back() {
        func.back();
    }
}

cliet调用

/**
     * 测试状态模式:与策略模式代码形式相似,但是状态模式会影响后续行为
     */
    public void testState() {
        StateController controller = new StateController();
        //设置状态
        controller.onLine();
        //省去了很多if-else的结构
        controller.run();
        controller.drive();
        controller.back();

    }

优点: State模式将所有与一个特定的状态相关的行为都放进一个状态对象中,他提供了一个更好的方法来组织与特定状态相关的代码,将繁琐的状态判断转换成结构清晰的状态类族,在避免代码膨胀的同事也保证了可扩展性与可维护性。

缺点: 增加了系统类和对象的个数。

评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值