一.状态模式简介 故名思议,状态模式的行为是由他的状态来决定的,状态模式把对象的行为动作包装在不同的状态对象里面,其中每一个状态对象都有共同的一个抽象状态基类,这样做的意图是让每一个对象内部的状态发生变化的时候会引起行为的改变。
二.状态模式的含义 当一个对象的内部状态发生改变的时候允许改变其行为,这个对象看起来是像改变了基类。 温馨提示: 这样理解有点抽象,你可以想象java的多态,最终原理其实就是透过多态改变行为。
三.使用场景 当代码中含有大量的与对象状态有关的条件语句时(即if–else或switch–case);这样代码的维护性和扩展性就受到大大的限制,所以才会出现状态设计模式。 温馨提示: 状态设模式是将每一个条件放到一个独立的类中,这样就可以根据对象自身的情况将对象的状态作为一个对象,着一个对象不依赖其他的对象而对立变化。实现机制就是多态。
四.Java场景模拟 我们作为一个程序员每天与电脑交流的时间比和女朋友交流的时间还多,那么对你来说电脑在熟悉不过了,下面的将使用电脑的开机,关机和休眠这几种状态来模拟这个场景,在开机状态下,你可以在电脑上打开应用,设置主题,修改主题,关闭应用的操作;而当电脑处于休眠状态下你需要唤醒电脑才能执行相应的操作;当处于关机状态你却任何操作都不能执行。下面我们随着代码模拟这个场景。 首先给你看看我的代码结构 1.首先看看电脑的状态,这个状态通过接口表示,我们可以通过这个接口的方法来实现控制电脑的状态
public interface ComputerPowerController { //电脑电源打开 public void powerOn(); //电脑电源关闭 public void powerOff(); //电脑电源休眠 public void powerSleep(); }2.无论电脑处于什么状态,但是电脑自带可以打开应用,设置主题,修改主题,关闭应用的操作是一直存在的,所以我们用一个基类即接口来表示电脑的方法。
public interface ComputerState { //打开电脑应用 public void openApplication(); //关闭电脑应用 public void closeApplication(); //设置主题 public void settingTheme(); //修改主题 public void modifyTheme(); }3.知道电脑有3中状态,那么我们就要将这3个状态中的每一个状态用一个独立的类表示,在这三种对立的状态下,电脑能执行的操作ComputerState 的方法也不同;前面也有提到状态设计模式的思想。下面我们来看看这3中状态的具体实现类; 电脑打开的时候可以执行的操作
public class ComputerPowerOnState implements ComputerState{ @Override public void openApplication() { System.out.println("===打开应用"); } @Override public void closeApplication() { System.out.println("===关闭应用"); } @Override public void settingTheme() { System.out.println("===设置主题"); } @Override public void modifyTheme() { System.out.println("===修改主题"); } }电脑在休眠的时候可以执行的操作 电脑在休眠状况下需要唤醒才能执行相应的操作
public class ComputerPowerSleepState implements ComputerState{ @Override public void openApplication() { System.out.println("===请输入密码唤醒电脑"); } @Override public void closeApplication() { System.out.println("===请输入密码唤醒电脑"); } @Override public void settingTheme() { System.out.println("===请输入密码唤醒电脑"); } @Override public void modifyTheme() { System.out.println("===请输入密码唤醒电脑"); } }电脑在关机后的可执行操作 电脑在关机以后什么都不能做,所以我们用空实现代替
public class ComputerPowerOffState implements ComputerState{ @Override public void openApplication() { } @Override public void closeApplication() { } @Override public void settingTheme() { } @Override public void modifyTheme() { } }4.通过控制电脑可以执行相应的操作,我们这里用这个ComputerController类代替,并且实现ComputerPowerController 这个接口,让电脑在不同的状况下执行相应的行为;
public class ComputerController implements ComputerPowerController{ private ComputerState mComputerState; public void setComputerState(ComputerState computerState){ this.mComputerState = computerState; } @Override public void powerOn() { setComputerState(new ComputerPowerOnState()); System.out.println("===打开电脑"); } @Override public void powerOff() { setComputerState(new ComputerPowerOffState()); System.out.println("===关闭电脑"); } @Override public void powerSleep() { setComputerState(new ComputerPowerSleepState()); System.out.println("===电脑处于休眠状态"); } public void openApplication(){ mComputerState.openApplication(); } public void closeApplication(){ mComputerState.closeApplication(); } public void settingTheme(){ mComputerState.settingTheme(); } public void modifyTheme(){ mComputerState.modifyTheme(); } }5.全部功能都有了,那么我们就可以认为操作这个电脑了。
public class StateClient { public static void main(String[] args) { ComputerController controller = new ComputerController(); //打开电脑 controller.powerOn(); //打开应用 controller.openApplication(); //设置主题 controller.settingTheme(); //修改主题 controller.modifyTheme(); //关闭应用 controller.closeApplication(); //电脑休眠 controller.powerSleep(); //打开应用 controller.openApplication(); //电脑关机 controller.powerOff(); //打开应用 controller.openApplication(); } }最后让我们看看输出结果
由此我们可以知道,当电脑处于休眠状态下,我们需要唤醒电脑才能执行打开应用的操作,关机什么都不能执行,正如上图所示,在休眠状况下controller.openApplication();没有被执行,验证了我们的观点。
最后,我们前面所说,这个设计模式的本质是多态,那么在什么地方用到了多态呢?答案就在电脑可以执行的方法ComputerState 这个类里面;关键代码ComputerController 类中调用openApplication(),closeApplication(),settingTheme(),modifyTheme()里面;这下应该很清晰了吧。
现在以java例子讲解,第二篇我会结合android应用写一篇。待续。。。。。。
逆风的方向,更适合飞翔