状态模式定义:当一个对象内在状态改变时允许其改变行为,这个对象看起来像改变了其类。
优点:
1、结构清晰,避免使用过多的switch……case或者if……else语句,避免程序的复杂性,提高系统的可维护性。
2、遵循设计原则,很好的体现了开闭原则和单一职责原则。
3、封装性非常好。
缺点:
如果子类太多,就会造成类膨胀的问题。
类图如下:
实现代码如下:
context类:
package com.designpatterns.state;
/**
* @author WSYW126
* @version 创建时间:2016年4月14日 上午11:44:45
* 类说明:Alljava
*/
public class Context {
public final static OpenState openState = new OpenState();
public final static CloseState closeState = new CloseState();
public final static RunState runState = new RunState();
public final static StopState stopState = new StopState();
public final static NOPowerState nOPowerState = new NOPowerState();
private State state;
public void run() {
this.state.run();
}
public void stop() {
this.state.stop();
}
public void open() {
this.state.open();
}
public void close() {
this.state.close();
}
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
this.state.setContext(this);
}
}
liftState类:
package com.designpatterns.state;
/**
* @author WSYW126
* @version 创建时间:2016年4月14日 上午11:44:01
* 类说明:Alljava
*/
public abstract class State {
protected Context context;
public abstract void open();
public abstract void close();
public abstract void run();
public abstract void stop();
public abstract void noPower();
public State() {
}
public Context getContext() {
return context;
}
public void setContext(Context context) {
this.context = context;
}
}
OpenState类:
package com.designpatterns.state;
/**
* @author WSYW126
* @version 创建时间:2016年4月14日 上午11:48:11 类说明:Alljava
*/
public class OpenState extends State {
@Override
public void open() {
System.out.println("电梯正在开门!");
}
@Override
public void close() {
super.context.setState(Context.closeState);
super.context.getState().close();
}
@Override
public void run() {
System.out.println("请关门");
}
@Override
public void stop() {
}
@Override
public void noPower() {
}
}
stopState类:
package com.designpatterns.state;
/**
* @author WSYW126
* @version 创建时间:2016年4月14日 上午11:49:37
* 类说明:Alljava
*/
public class StopState extends State {
@Override
public void open() {
super.context.setState(Context.openState);
super.context.getState().open();
}
@Override
public void close() {
}
@Override
public void run() {
super.context.setState(Context.runState);
super.context.getState().run();
}
@Override
public void stop() {
System.out.println("正在停止!");
}
@Override
public void noPower() {
// TODO Auto-generated method stub
}
}
runState类:
package com.designpatterns.state;
/**
* @author WSYW126
* @version 创建时间:2016年4月14日 上午11:49:26 类说明:Alljava
*/
public class RunState extends State {
@Override
public void open() {
}
@Override
public void close() {
}
@Override
public void run() {
System.out.println("正在运行!");
}
@Override
public void stop() {
super.context.setState(Context.stopState);
super.context.getState().stop();
}
@Override
public void noPower() {
}
}
closeState类:
package com.designpatterns.state;
/**
* @author WSYW126
* @version 创建时间:2016年4月14日 上午11:49:15
* 类说明:Alljava
*/
public class CloseState extends State {
public CloseState() {
}
@Override
public void open() {
super.context.setState(Context.openState);
super.context.getState().open();;
}
@Override
public void close() {
System.out.println("正在关门!");
}
@Override
public void run() {
super.context.setState(Context.runState);
super.context.getState().run();
}
@Override
public void stop() {
super.context.setState(Context.stopState);
super.context.getState().stop();
}
@Override
public void noPower() {
}
}
没电的状态类:
package com.designpatterns.state;
/**
* @author WSYW126
* @version 创建时间:2016年4月14日 上午11:49:48
* 类说明:Alljava
*/
public class NOPowerState extends State {
public NOPowerState() {
// TODO Auto-generated constructor stub
}
@Override
public void open() {
// TODO Auto-generated method stub
}
@Override
public void close() {
// TODO Auto-generated method stub
}
@Override
public void run() {
// TODO Auto-generated method stub
}
@Override
public void stop() {
// TODO Auto-generated method stub
}
@Override
public void noPower() {
// TODO Auto-generated method stub
}
}
测试类:
package com.designpatterns.state;
/**
* @author WSYW126
* @version 创建时间:2016年4月14日 下午12:11:48
* 类说明:Alljava
*/
public class Client {
public static void main(String[] args) {
Context context = new Context();
context.setState(new CloseState());
context.open();
context.run();
context.close();
context.run();
context.stop();
}
}
这就是状态模式。
参考资料:
设计模式之禅
备注:
转载请注明出处
http://blog.youkuaiyun.com/wsyw126/article/details/51335178
by WSYW126