首先明白两个单词:打开和关闭是同一个物体的两种状态,是需要经常互相切换的,不是没有关系的两个单词. let`s Go
概念:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。
应用场景:经常切换状态去做一些事情的时候,如在不同的天气做事的方式,穿的衣服不同. 画图工具不同的工具执行的事件效果不同.
好处:一次改变,处处使用
状态模式的实现方式多种多样,有时候仅仅是符合状态的一点规则,也可以成为状态模式.下面我用两个例子说明,第一个是典型的状态模式,第二个是比较模糊的状态模式
//状态接口
package note.com.state; /** * 状态接口定义 * @author lxz * */ public interface State { public State changeState(); public void doOne(); public void doTwo(); public void doThree(); }
//具体状态
package note.com.state; public class Open implements State{ public State changeState() { return new Connect(); } public void doOne() { System.out.println("事件一:打开状态执行"); } public void doTwo() { System.out.println("事件二:打开状态执行"); } public void doThree() { System.out.println("事件三:打开状态执行"); } }
package note.com.state; public class Connect implements State{ public State changeState() { return new Close(); } public void doOne() { System.out.println("事件一:连接状态执行"); } public void doTwo() { System.out.println("事件二:连接状态执行"); } public void doThree() { System.out.println("事件三:连接状态执行"); } }
package note.com.state; public class Close implements State{ public State changeState() { return new Open(); } public void doOne() { System.out.println("事件一:关闭状态执行"); } public void doTwo() { System.out.println("事件二:关闭状态执行"); } public void doThree() { System.out.println("事件三:关闭状态执行"); } }
//根据状态来执行具体操作的类
package note.com.state; public class Context { private State state = null; public Context(){ state = new Open(); } public State getState() { return state; } public void setState(State state) { this.state = state; } public void execute(){ state.doOne(); state.doTwo(); state.doThree(); state = state.changeState(); } }
//测试类
package note.com.state; public class StateTest { public static void main(String[] args) { Context context = new Context(); context.execute(); context.execute(); context.execute(); context.execute(); } }
结果:
事件一:打开状态执行
事件二:打开状态执行
事件三:打开状态执行
事件一:连接状态执行
事件二:连接状态执行
事件三:连接状态执行
事件一:关闭状态执行
事件二:关闭状态执行
事件三:关闭状态执行
事件一:打开状态执行
事件二:打开状态执行
事件三:打开状态执行
//工具基类
package note.com.state; /** * 工具基类 * @author lxz * */ public abstract class ATool { public abstract void leftMouseClick(); public abstract void rightMouseClick(); public abstract void leftDoubleMouseClick(); }
//具体工具类
package note.com.state; /** * 圆形工具 * @author lxz * */ public class Circle extends ATool{ @Override public void leftMouseClick() { System.out.println("界面出现了一个圆"); } @Override public void rightMouseClick() { System.out.println("界面出现了圆形的属性菜单"); } @Override public void leftDoubleMouseClick() { System.out.println("界面出现了一个圆"); System.out.println("界面出现了一个圆"); } }
package note.com.state; /** * 油漆桶工具 * @author lxz * */ public class PaintKettle extends ATool{ @Override public void leftMouseClick() { System.out.println("界面出现了填充颜色"); } @Override public void rightMouseClick() { System.out.println("界面出现了油漆桶的属性菜单"); } @Override public void leftDoubleMouseClick() { System.out.println("界面出现了填充颜色,颜色更深了"); } }
package note.com.state; /** * 画笔工具 * @author lxz * */ public class Pen extends ATool{ @Override public void leftMouseClick() { System.out.println("界面出现了一个点"); } @Override public void rightMouseClick() { System.out.println("界面出现了画笔工具的属性菜单"); } @Override public void leftDoubleMouseClick() { System.out.println("界面出现了一个点"); } }
package note.com.state; /** * 矩形工具 * @author lxz * */ public class Rectangle extends ATool{ @Override public void leftMouseClick() { System.out.println("界面出现了一个矩形"); } @Override public void rightMouseClick() { System.out.println("界面出现了矩形工具的属性菜单"); } @Override public void leftDoubleMouseClick() { System.out.println("界面出现了一个矩形"); System.out.println("界面出现了一个矩形"); } }
//画图工具界面类
package note.com.state; /** * 管理工具的界面 * * @author lxz * */ public class UI { private ATool tool = new Pen();// 默认是画笔工具 public static final int PEN = 1; public static final int RECTANGLE = 2; public static final int CIRCLE = 3; public static final int PAINTKETTLE = 4; public UI() { System.out.println("画图工具已经启动"); } /* * 切换工具(状态) */ public void changeTool(int toolNum) { switch (toolNum) { case PEN: tool = new Pen(); break; case RECTANGLE: tool = new Rectangle(); break; case CIRCLE: tool = new Circle(); break; case PAINTKETTLE: tool = new PaintKettle(); break; default: tool = new Pen(); break; } } public void leftMouseClick(){ tool.leftMouseClick(); } public void rightMouseClick(){ tool.rightMouseClick(); } public void leftDoubleMouseClick(){ tool.leftDoubleMouseClick(); } }
//测试类
package note.com.state; public class ToolTest { public static void main(String[] args) { System.out.println("启动画图工具......"); UI ui = new UI();//启动画图工具 System.out.println("点击画笔工具......"); ui.changeTool(UI.PEN);//点击画笔工具 System.out.println("左键点击画板......"); ui.leftMouseClick();//左键点击画板 System.out.println("点击圆形工具......"); ui.changeTool(UI.CIRCLE);//点击圆形工具 System.out.println("左键双击画板......"); ui.leftDoubleMouseClick();//左键双击画板 } }
结果:
启动画图工具......
画图工具已经启动
点击画笔工具......
左键点击画板......
界面出现了一个点
点击圆形工具......
左键双击画板......
界面出现了一个圆
界面出现了一个圆
原文:http://www.cnblogs.com/qinggege/p/5243027.html