为啥第2个说状态模式呢,说是这两种模式在使用结构上有点相似,不过,实际上也的确是这样的,呵呵,下面细说。
1. 定义
整个对象的行为,基于它的状态变化,各个状态之间可以动态切换,且状态切换时,对象内部还有一些其他逻辑的变化。
2. 优点
1)代码结构清晰:原本可能所有状态的逻辑,都集中或是分散在单个类里,真正去理解单个状态的行为动作时,会比较繁杂一些
2)将各个状态独立出来后,方便后续理解和维护
3. 缺点
1)会增加系统的类和实例的数量
2)单独抽出状态类后,可能会增加系统开发的复杂度
3)不是完全支持开闭原则,添加新状态,并切换状态时,需要调整原有代码
4. 结构
- 抽象状态类: 定义一个接口,用以封装各个状态下的特定行为
- 具体状态:实现抽象状态所对应的行为,并在满足条件的情况下切换状态
- 环境类:定义相关业务接口,并维护一个状态引用
5. 实现
妈妈做饭的状态可能是多种多样的,分开心的时候,生气的时候,呵呵。
package pattern.state;
//做饭状态
interface CookState {
public void cook(Context context);
}
//开心做饭状态
class HappyCookState implements CookState {
@Override
public void cook(Context context) {
String content = context.getContent();
if(content.equals("我不喜欢吃蔬菜")){
System.out.println("不喜欢吃,不能说,妈妈要生气了");
context.setCookState(new AngryCookState());
}
}
}
//生气做饭状态
class AngryCookState implements CookState {
@Override
public void cook(Context context) {
String content = context.getContent();
if(content.equals("你好漂亮")){
System.out.println("妈妈开心了,说不定,还加个菜,太棒了!");
context.setCookState(new HappyCookState());
}
}
}
//环境
class Context {
private CookState cookState; //保留的一个状态引用
private String content; //和妈妈交流的内容
public Context(){
this.cookState = new HappyCookState();
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public CookState getCookState() {
return cookState;
}
public void setCookState(CookState cookState) {
this.cookState = cookState;
}
//接口外部请求
public void talkHandler(String content){
this.content = content;
cookState.cook(this);
}
}
public class StateTest {
public static void main(String[] args) {
Context context = new Context();
context.talkHandler("我不喜欢吃蔬菜");
context.talkHandler("你好漂亮");
}
}
//不喜欢吃,不能说,妈妈要生气了
//妈妈开心了,说不定,还加个菜,太棒了!
网友评论