Java设计模式之State(状态模式)
定义: GOF《设计模式》中给状态模式下的定义为:允许一个对象在其内部状态改变时改变它的行为。
先看一个例子:
- package com.state;
- public class KissingPrincess {
-
- private boolean isFrog = true;
-
- public void greet() {
- if (isFrog)
- System.out.println("frog!");
- else
- System.out.println("prince!");
- }
-
- public void kiss() {
- isFrog = false;
- }
-
-
- public static void main(String[] args) {
- KissingPrincess prince = new KissingPrincess();
- prince.greet();
- prince.kiss();
- prince.greet();
- }
- }
输出结果:
frog!
prince!
这个例子中,用了一个变量isFrog来标识是青蛙还是王子,如果是王子的话,输出"prince!",是青蛙的话,输出:“frog!”。
本例中的写法,用个朋友的话来说,只是“入门级程序员的写法”。在java中,要时时注意OOP(Object Oriented Programming)的概念。
如果状态很多的话,就会使用很多if else 语句,不仅繁琐难于维护,而且没有体现出面向对象编程的思想。
对上例应用状态模式后,可以变成如下的代码:
- package com.state;
- public class KissingPrincess2 {
-
- private State state = new Frog();
-
- private interface State {
- void response();
- }
-
- private class Frog implements State {
-
- @Override
- public void response() {
- System.out.println("frog!");
- }
- }
-
- private class Prince implements State {
-
- @Override
- public void response() {
- System.out.println("prince!");
- }
- }
-
- public void greet() {
- state.response();
- }
-
- public void change(State state) {
- this.state = state;
- }
-
- public static void main(String[] args) {
- KissingPrincess2 prince2 = new KissingPrincess2();
- prince2.greet();
- prince2.change(prince2.new Prince());
- prince2.greet();
- }
- }
输出结果:
frog!
prince!
上述例子就是state模式的基本思想,希望读者朋友们认真体会。
这里再举个state模式的例子:
玩过cs的人都知道,cs里面有很多枪,ak47啊,m16啊,但是不管什么枪,你拿起以后,都只用扣动扳机就能够把子弹打出去。这就和我们state模式思想是一样的,不管底层怎么实现(比如上述例子中的判断是frog还是prince,然后执行不同的操作),外层的接口都不变(greet方法)。