Google 微软 Apple 无人驾驶 Java 人工智能 大数据 阿里巴巴 特斯拉 Facebook VR/AR 安全 手机 亚马逊 机器人 云计算

设计模式-StatePattern-状态模式-我是驾驶员

意图:允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。

主要解决:对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为。

何时使用:代码中包含大量与对象状态有关的条件语句。

如何解决:将各种具体的状态类抽象出来。

关键代码:通常命令模式的接口中只有一个方法。而状态模式的接口中有一个或者多个方法。而且,状态模式的实现类的方法,一般返回值,或者是改变实例变量的值。也就是说,状态模式一般和对象的状态有关。实现类的方法有不同的功能,覆盖接口中的方法。状态模式和命令模式一样,也可以用于消除 if…else 等条件选择语句。

 

下面这个举一个通俗易懂的开车的例子:

 

 

State Interface
public interface State {
    void doAction(Driver driver);
}

Driver
public class Driver {
    private State state;

    public Driver(State state) {
        this.state = state;
    }

    public void setState(State state) {
        this.state = state;
    }

    public void work() {
        state.doAction(this);
    }

    public static void main(String[] args) {
        Driver c = new Driver(new FindCarState());
        c.work();
    }
}

FindCarState
public class FindCarState implements State {
    @Override
    public void doAction(Driver driver) {
        System.out.println("1 Found car");
        driver.setState(new OpenDoorState());
        driver.work();
    }
}

OpenDoorState
public class OpenDoorState implements State {
    @Override
    public void doAction(Driver driver) {
        System.out.println("2 Open Door Finish");
        driver.setState(new StartCarState());
        driver.work();
    }
}

StartCarState
public class StartCarState implements State {
    @Override
    public void doAction(Driver driver) {
        System.out.println("3 Start Car Finish");
        driver.setState(new StopCarState());
        driver.work();
    }
}

StopCarState
public class StopCarState implements State {
    @Override
    public void doAction(Driver driver) {
        System.out.println("4 Stop Car Finish @home");
    }
}
点赞 2 打赏

我要评论

关于"设计模式-StatePattern-状态模式-我是驾驶员"的评论(1条)