狀態模式: 根據狀態決定動作 當動作一定但是狀態可擴展適合使用狀態模式 當動作變化不適合 當狀態不會擴展也沒有必要使用使用傳統的switch即可。 先看一個沒有使用狀態模式的例子: package com.srr.dp.state; /** * 我的女朋友有很多種狀態 * 當給我的女朋友添加新的狀態 ...
狀態模式:
- 根據狀態決定動作
- 當動作一定但是狀態可擴展適合使用狀態模式
- 當動作變化不適合
- 當狀態不會擴展也沒有必要使用使用傳統的switch即可。
先看一個沒有使用狀態模式的例子:
package com.srr.dp.state; /** * 我的女朋友有很多種狀態 * 當給我的女朋友添加新的狀態的時候下麵所有方法的swith語句中都需要添加新的分支判斷 * 簡而言之,這種實現方式當增加新的狀態時非常不方便 */ public class GirFriend { private String name; private enum State {HAPPY,NORMAL} private State state; private void smile(){ switch (state){ case HAPPY: System.out.println("哈哈哈大笑"); break; case NORMAL: System.out.println("微微一笑"); default: System.out.println(); } } private void cry(){ switch (state){ case HAPPY: System.out.println("笑中帶淚,感動的哭泣"); break; case NORMAL: System.out.println("哇哇哭泣"); break; default: System.out.println(); } } private void say(){ switch (state){ case HAPPY: System.out.println("侃侃而談,風趣幽默"); break; case NORMAL: System.out.println("沉默寡言,很少說話"); default: System.out.println(); } } }
使用狀態模式之後代碼如下:
package com.srr.dp.state; /** * 狀態抽象類 */ abstract public class State { abstract void smile(); abstract void cry(); abstract void say(); } package com.srr.dp.state; /** * 女朋友的正常狀態 */ public class NormalState extends State { @Override void smile() { System.out.println("微微一笑"); } @Override void cry() { System.out.println("哇哇哭泣"); } @Override void say() { System.out.println("沉默寡言,很少說話"); } } package com.srr.dp.state; /** * 女朋友高興狀態 */ public class HappyState extends State { @Override void smile() { System.out.println("哈哈哈大笑"); } @Override void cry() { System.out.println("笑中帶淚,感動的哭泣"); } @Override void say() { System.out.println("侃侃而談,風趣幽默"); } } package com.srr.dp.state; /** * 當添加新的狀態的時候只需要添加新的狀態類繼承抽象state類 */ public class GirFriend2 { private String name; private State state; public GirFriend2(String name,State state){ this.name = name; this.state = state; } public void smile(){ state.smile(); } public void cry(){ state.cry(); } public void say(){ state.say(); } } package com.srr.dp.state; /** * 測試類 */ public class T { public static void main(String[] args) { State state = new HappyState(); GirFriend2 girFriend = new GirFriend2("程瀟",state); girFriend.smile(); girFriend.cry(); girFriend.say(); } }
寫到這裡當我女朋友添加一種新的狀態的時候只需要添加一個新的狀態類繼承抽象state類即可。
運行結果: