《您的设计模式》(CBF4LIFE)之“状态模式”【整理】

来源:互联网 发布:扫描身份证软件 编辑:程序博客网 时间:2024/05/22 01:59

以电梯的打开、关闭、运行、停止的四个状态,为示例。

 

一、抽象类

package com.teng.abs;/** * 定义一个电梯的接口 * <br>创建日期:2016年10月21日 * <br><b>Copyright 2016 UTOUU All Rights Reserved</b> * @author tengxiang * @since 1.1 * @version 1.1 */public abstract class LiftState {//定义一个环境角色,也就是封装状态的变换引起的功能变化protected Context context;public void setContext(Context context) {this.context = context;}//开启public abstract void open();//关闭public abstract void close();//跑public abstract void run();//停public abstract void stop();}


二、抽象类的四个实现

package com.teng.abs;/** * 在电梯门开启状态下能做什么事情 * <br>创建日期:2016年10月21日 * <br><b>Copyright 2016 UTOUU All Rights Reserved</b> * @author tengxiang * @since 1.1 * @version 1.1 */public class OpenningState extends LiftState {@Overridepublic void open() {System.out.println("电梯门开启。。。。。。。。。");}@Overridepublic void close() {//状态修改super.context.setLiftState(Context.closingState);//动作委托为CloseState来执行super.context.getLiftState().close();}@Overridepublic void run() {// TODO Auto-generated method stub}@Overridepublic void stop() {// TODO Auto-generated method stub}}
package com.teng.abs;public class ClosingState extends LiftState {@Overridepublic void open() {super.context.setLiftState(Context.openningState);super.context.getLiftState().open();}@Overridepublic void close() {System.out.println("电梯门关闭。。。");}@Overridepublic void run() {super.context.setLiftState(Context.runningState);super.context.getLiftState().run();}@Overridepublic void stop() {super.context.setLiftState(Context.stoppingState);super.context.getLiftState().stop();}}
package com.teng.abs;public class RunningState extends LiftState {@Overridepublic void open() {// TODO Auto-generated method stub}@Overridepublic void close() {// TODO Auto-generated method stub}@Overridepublic void run() {System.out.println("电梯上下跑。。。。。。");}@Overridepublic void stop() {super.context.setLiftState(Context.stoppingState);super.context.getLiftState().stop();}}
package com.teng.abs;public class StoppingState extends LiftState {@Overridepublic void open() {super.context.setLiftState(Context.openningState);super.context.getLiftState().open();}@Overridepublic void close() {// TODO Auto-generated method stub}@Overridepublic void run() {super.context.setLiftState(Context.runningState);super.context.getLiftState().run();}@Overridepublic void stop() {System.out.println("电梯停止了。。。。。。");}}

三、环境角色

package com.teng.abs;/** * 环境角色 * <br>创建日期:2016年10月24日 * <br><b>Copyright 2016 UTOUU All Rights Reserved</b> * @author tengxiang * @since 1.1 * @version 1.1 */public class Context {//定义出所有的电梯状态public final static OpenningState openningState = new OpenningState();public final static ClosingState closingState = new ClosingState();public final static RunningState runningState = new RunningState();public final static StoppingState stoppingState = new StoppingState();//定义一个当前电梯状态private LiftState liftState;public LiftState getLiftState(){return liftState;}public void setLiftState(LiftState liftState){this.liftState = liftState;//把当前的环境通知到各个实现类中this.liftState.setContext(this);}public void open(){this.liftState.open();}public void close(){this.liftState.close();}public void run(){this.liftState.run();}public void stop(){this.liftState.stop();}}

四、客户端

package com.teng.abs;/** * 模拟电梯动作 * <br>创建日期:2016年10月24日 * <br><b>Copyright 2016 UTOUU All Rights Reserved</b> * @author tengxiang * @since 1.1 * @version 1.1 */public class Client {public static void main(String[] args) {Context context = new Context();context.setLiftState(new ClosingState());context.open();context.close();context.run();context.stop();}}

什么是状态模式呢?当一个对象内在状态改变时允许其改变行为,这个对象看起来像是改变了其类。状态模式封装的非常好,状态的变更引起了行为的变更,从外部看起来就好像这个对象对应的类发生了改变一样。

状态模式使用于当某个对象在它的状态发生改变时,它的行为也随着发生比较大的变化,也就是说行为是受状态约束的情况下可以使用状态模式,而且状态模式使用时对象的状态最好不要超过五个。


0 0