状态模式---态度决定一切

    声明:文章内容根据大牛博客的内容,自己理解后,给自己做的学习笔记,文末会附上大牛博客地址链接。有需要沟通交流的可加我QQ群:425120333 
    每人个每天都有自己的态度,或高兴、或伤心、或幸福等等。各个态度之间也能自由的切换,人有各种各样的状态,其他物品也有他
们各自的状态。比如说电梯就有各个状态,开门状态,关门状态,运行状态,停止状态。各个状态之间是能够相互切换的,但也有一定的限制:
开门状态--->关门状态;
关门状态--->开门状态、运行状态;
运行状态--->停止状态;
停止状态--->开门状态、运行状态;
这里表示的意思是各个状态之间能够进行的转换。比如是开门状态只能转换到关门状态,而无法转换到其他状态。
/**
 * @introduce:具体电梯类
 * 
 */
public class Lift {
    public static final LiftState OPEN_STATE = new OpenState();
    public static final LiftState CLOSE_STATE = new CloseState();
    public static final LiftState RUNNING_STATE = new RunningState();
    public static final LiftState STOP_STATE = new StopState();

    public LiftState state;

    public LiftState getState() {
        return state;
    }

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

    public void open() {
        this.state.open();
    }

    public void close() {
        this.state.close();
    }

    public void running() {
        this.state.running();
    }

    public void stop() {
        this.state.stop();
    }
}
/**
 * @introduce:电梯状态抽象类
 * 
 */
public abstract class LiftState {
    protected Lift lift;

    protected void setLift(Lift lift) {
        this.lift = lift;
    }

    public abstract void open();

    public abstract void close();

    public abstract void running();

    public abstract void stop();
}
/**
 * @introduce:开门状态
 * 
 */
public class OpenState extends LiftState {

    @Override
    public void open() {
        System.out.println("---电梯门已开启......");
    }

    @Override
    public void close() {
        super.lift.setState(Lift.CLOSE_STATE);
        super.lift.state.close();
    }

    @Override
    public void running() {
        System.out.println("***********警告:门开着不允许运行");
    }

    @Override
    public void stop() {
        System.out.println("***********警告:门开着已经是停止的");
    }

}
/**
 * @introduce:关门状态
 * 
 */
public class CloseState extends LiftState {

    @Override
    public void open() {
        super.lift.setState(Lift.OPEN_STATE);
        super.lift.open();
    }

    @Override
    public void close() {
        System.out.println("---电梯门已关闭......");

    }

    @Override
    public void running() {
        super.lift.setState(Lift.RUNNING_STATE);
        super.lift.running();
    }

    @Override
    public void stop() {
        System.out.println("***********警告:电梯未运行,不用停止");
    }

}
/**
 * @introduce:运行状态
 * 
 */
public class RunningState extends LiftState {

    @Override
    public void open() {
        System.out.println("***********警告:运行中不允许开门");

    }

    @Override
    public void close() {
        System.out.println("***********警告:运行中门已经是关闭的");

    }

    @Override
    public void running() {
        System.out.println("---电梯门正在运行中......");
    }

    @Override
    public void stop() {
        super.lift.setState(Lift.STOP_STATE);
        super.lift.stop();
    }

}
/**
 * @introduce:停止状态
 * 
 */
public class StopState extends LiftState {

    @Override
    public void open() {
        super.lift.setState(Lift.OPEN_STATE);
        super.lift.open();
    }

    @Override
    public void close() {
        System.out.println("***********警告:停止状态门已经是关闭的");

    }

    @Override
    public void running() {
        super.lift.setState(Lift.RUNNING_STATE);
        super.lift.running();
    }

    @Override
    public void stop() {
        System.out.println("---电梯门已停止......");

    }

}
/**
 * @introduce:场景类
 * 
 */
public class Client {
    public static void main(String[] args) {
        Lift lift = new Lift();
        System.out.println("----------开门状态下的转换------------");
        lift.setState(new OpenState());
        lift.running();
        lift.stop();
        lift.close();
        System.out.println("----------关门状态下的转换------------");
        lift.stop();
        lift.open();
        lift.close();
        lift.running();
        System.out.println("----------运行状态下的转换------------");
        lift.open();
        lift.close();
        lift.stop();
        System.out.println("----------停止状态下的转换------------");
        lift.close();
        lift.running();
        lift.stop();
        lift.open();
    }
}

控制台输出:
———-开门状态下的转换————
*警告:门开着不允许运行
*警告:门开着已经是停止的
—电梯门已关闭……
———-关门状态下的转换————
*警告:电梯未运行,不用停止
—电梯门已开启……
—电梯门已关闭……
—电梯门正在运行中……
———-运行状态下的转换————
*警告:运行中不允许开门
*警告:运行中门已经是关闭的
—电梯门已停止……
———-停止状态下的转换————
*警告:停止状态门已经是关闭的
—电梯门正在运行中……
—电梯门已停止……
—电梯门已开启……

    通过模拟电梯各个状态之间的转换来理解状态模式的使用,状态模式指的是当一个对象内在状态改变时允许改变其行为,使得该对象
看起来改变了状态。状态模式适用于行为受对象约束的情况下使用,而且使用时对象的状态最好不要超过5个。
参考大牛博客:http://www.cnblogs.com/zuoxiaolong/p/pattern22.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值