java设计模式-State模式
1.背景:
MM的状态是非常不固定的,说不定刚才还非常高兴,没准一会就生气了。就跟六月的天似的,说变就变。
封装一下MM的状态:smile,cry,say;MM的状态决定了这些方法该怎么执行.
2.代码:
Boy.java:
package com.cy.dp.state; public class Boy { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
状态类:State.java(抽象类,具体实现交给子类)
//状态类 public abstract class State { public abstract void smile(); public abstract void cry(); public abstract void say(); }
HappyState.java (高兴状态)
package com.cy.dp.state; public class HappyState extends State { @Override public void smile() { // happy smile } @Override public void cry() { // happy cry } @Override public void say() { // happy say } }
UnHappyState.java (不高兴状态)
package com.cy.dp.state; public class UnHappyState extends State { @Override public void smile() { // unhappy smile } @Override public void cry() { // unhappy cry } @Override public void say() { // unhappy say } }
MM.java:
package com.cy.dp.state; public class MM { private String name; private State state = new HappyState(); public String getName() { return name; } public void setName(String name) { this.name = name; } public void smile(){ state.smile(); } public void cry(){ state.cry(); } public void say(){ state.cry(); } }
3.小结:
state用的也并不多;简单用一句话解释,就是:一个类的动作是根据这个类的内部状态的不同,而有不同的动作。
疑问:
1.这跟策略模式有什么区别啊?不同的策略我就怎么执行呗。
2.这不就是一个简单的多态的应用吗?
答:
没错,设计模式很多时候区分这个还是那个,往往是在语义上的区分而不是语法上的区分,比如说这里咱们说清楚了这就是不同的状态下我们执行不同的方法,那就是State模式。
当然, 你说我不同的策略使用不同的方法,哭的策略使用哭的方法,高兴的策略用高兴的方法,也能说得过去;所以在这点上不要咬文嚼字。理解它是什么意思就够了;