标签:
状态模式定义:当一个对象内在状态改变时允许其改变行为,这个对象看起来像改变了其类。
优点:
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); } }
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; } }
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() { } }
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 } }
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() { } }
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.csdn.net/wsyw126/article/details/51335178
by WSYW126
标签:
原文地址:http://blog.csdn.net/wsyw126/article/details/51335178