参考文档:
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"); } }