状态模式State(对象行为型)

参考文档:

1.设计模式书籍;

2. 设计模式 ( 十七) 状态模式State(对象行为型) http://blog.youkuaiyun.com/hguisu/article/details/7557252


状态模式State(对象行为型)

理论方面的只是,我这里不多说了,大家可以看看下面这篇文章:

设计模式 ( 十七) 状态模式State(对象行为型) http://blog.youkuaiyun.com/hguisu/article/details/7557252


代码实现,为上篇博客中的电梯的案例:

类图:


Client.java:

package com.rick.designpattern.state;

/**
 * Created by MyPC on 2017/6/2.
 */
public class Client {

    public static void main(String[] args) {
        Context context = new Context();

        context.open();
        context.close();
        context.open();
//        context.run();
        context.stop();
        context.stop();
        context.run();
        context.stop();
    }
}

Context.java:
package com.rick.designpattern.state;

/**
 * Created by MyPC on 2017/6/2.
 */
public class Context {
    private OpeningState mOpeningState = new OpeningState(this);
    private ClosingState mClosingState = new ClosingState(this);
    private RunningState mRunningState = new RunningState(this);
    private StoppingState mStoppingState = new StoppingState(this);

    private LiftState mLiftState;

    public Context() {
        setmLiftState(getmStoppingState());
        getmLiftState().setmContext(this);
    }

    public void open() {
        mLiftState.open();
    }

    public void close() {
        mLiftState.close();
    }

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

    public void stop() {
        mLiftState.stop();
    }

    public OpeningState getmOpeningState() {
        return mOpeningState;
    }

    public ClosingState getmClosingState() {
        return mClosingState;
    }

    public RunningState getmRunningState() {
        return mRunningState;
    }

    public StoppingState getmStoppingState() {
        return mStoppingState;
    }

    public LiftState getmLiftState() {
        return mLiftState;
    }

    public void setmLiftState(LiftState mLiftState) {
        this.mLiftState = mLiftState;
    }
}
LiftState.java:
package com.rick.designpattern.state;

/**
 * Created by MyPC on 2017/6/2.
 */
public abstract class LiftState {
    private Context mContext;

    public LiftState(Context mContext) {
        this.mContext = mContext;
    }

    /**
     * 电梯开门状态处理
     */
    abstract void open();


    /**
     * 电梯关门状态
     */
    abstract void close();

    /**
     * 电梯运行状态,如上楼、下楼
     */
    abstract void run();

    /**
     * 电梯停止状态
     */
    abstract void stop();


    public Context getmContext() {
        return mContext;
    }

    public void setmContext(Context mContext) {
        this.mContext = mContext;
    }
}
OpeningState.java:
package com.rick.designpattern.state;

/**
 * Created by MyPC on 2017/6/2.
 */
public class OpeningState extends LiftState {
    public OpeningState(Context mContext) {
        super(mContext);
    }

    @Override
    void open() {
        System.out.println("lift is state in open");
    }

    @Override
    void close() {
        getmContext().setmLiftState(getmContext().getmClosingState());
        getmContext().close();
    }

    @Override
    void run() {
        throw new NullPointerException("lift is state in open");
    }

    @Override
    void stop() {
        getmContext().setmLiftState(getmContext().getmStoppingState());
        getmContext().stop();
    }
}
ClosingState.java:
package com.rick.designpattern.state;

/**
 * Created by MyPC on 2017/6/2.
 */
public class ClosingState extends LiftState {
    public ClosingState(Context mContext) {
        super(mContext);
    }

    @Override
    void open() {
        getmContext().setmLiftState(getmContext().getmOpeningState());
        getmContext().open();
    }

    @Override
    void close() {
        System.out.println("lift is state in close");
    }

    @Override
    void run() {
        getmContext().setmLiftState(getmContext().getmRunningState());
        getmContext().run();
    }

    @Override
    void stop() {
        getmContext().setmLiftState(getmContext().getmStoppingState());
        getmContext().stop();
    }
}
RunningState.java:
package com.rick.designpattern.state;

/**
 * Created by MyPC on 2017/6/2.
 */
public class RunningState extends LiftState {
    public RunningState(Context mContext) {
        super(mContext);
    }

    @Override
    void open() {
        throw new NullPointerException("lift is state in run");
    }

    @Override
    void close() {
        throw new NullPointerException("lift is state in run");
    }

    @Override
    void run() {
        System.out.println("lift is state in run");
    }

    @Override
    void stop() {
        getmContext().setmLiftState(getmContext().getmStoppingState());
        getmContext().stop();
    }
}
StoppingState.java:
package com.rick.designpattern.state;

/**
 * Created by MyPC on 2017/6/2.
 */
public class StoppingState extends LiftState {
    public StoppingState(Context mContext) {
        super(mContext);
    }

    @Override
    void open() {
        getmContext().setmLiftState(getmContext().getmOpeningState());
        getmContext().open();
    }

    @Override
    void close() {
        getmContext().setmLiftState(getmContext().getmClosingState());
        getmContext().close();
    }

    @Override
    void run() {
        getmContext().setmLiftState(getmContext().getmRunningState());
        getmContext().run();
    }

    @Override
    void stop() {
        System.out.println("lift is state in stop");
    }
}
































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值