参考:https://blog.csdn.net/weixin_48052161/article/details/119696250
生活中的状态模式:
以水为例,水之三态,固、液、气,三种状态表现出不同的特性和行为,它们之间的转换也伴随着热力学的现象。
电梯,有运行状态、开门状态、闭门状态、停止状态等
QQ来说,有几种状态,在线、隐身、忙碌等,每个状态对应不同的操作
java线程分为:新建状态(New),就绪状态(Runnable),运行状态(Running),阻塞状态(Blocked),死亡状态(Dead)
代码演示:
一个漂亮的MM 有开心和悲伤两种状态,且不同转态下,MM说的话,和哭笑的动作,都会根据状态的不同而不同.
if–else if和继承抽象天生适合转态模式,细品!!!
代码1:
if–else:
package com.example.dtest.design23.state;
public class MM {
// 姓名
String name;
// 转态
MMState state;
// 内置状态的类别,分为HAPPY,SAD2种
private enum MMState{HAPPY,SAD}
public void smile(){
if(state.equals(MMState.HAPPY)){
System.out.println("开怀大笑");
}else if(state.equals(MMState.SAD)){
System.out.println("无奈苦笑");
}
}
public void cry(){
if(state.equals(MMState.HAPPY)){
System.out.println("喜极而泣");
}else if(state.equals(MMState.SAD)){
System.out.println("嚎啕大哭");
}
}
public void say(){
if(state.equals(MMState.HAPPY)){
System.out.println("开心极了!");
}else if(state.equals(MMState.SAD)){
System.out.println("郁闷不说话了!!");
}
}
public void setHappy(){
this.state = MMState.HAPPY;
}
public void setSad(){
this.state = MMState.SAD;
}
}
测试:
package com.example.dtest.design23.state;
public class stateTest01 {
public static void main(String[] args) {
MM mm = new MM();
// 设置状态为开心
mm.setHappy();
// 调用方法
mm.smile();
mm.cry();
mm.say();
// 改变状态为Sad
mm.setSad();
System.out.println("-----------改变状态为Sad-------------");
// 调用方法
mm.smile();
mm.cry();
mm.say();
}
}
代码演示2:抽象继承
人物的行为状态抽象类:MMState
package com.example.dtest.design23.state.state02;
public abstract class MMState {
abstract void smile();
abstract void cry();
abstract void say();
}
行为状态实现类:
package com.example.dtest.design23.state.state02;
public class MMSadState extends MMState{
@Override
void smile() {
System.out.println("无奈苦笑");
}
@Override
void cry() {
System.out.println("嚎啕大哭");
}
@Override
void say() {
System.out.println("郁闷不说话!!!");
}
}
package com.example.dtest.design23.state.state02;
public class MMHappyState extends MMState{
@Override
void smile() {
System.out.println("开怀大笑");
}
@Override
void cry() {
System.out.println("喜极而泣");
}
@Override
void say() {
System.out.println("开心极了");
}
}
人物执行门面类:
package com.example.dtest.design23.state.state02;
public class MM {
// 姓名
String name;
// 状态 默认为无状态
MMState state = null;
public void smile(){
state.smile();
}
public void cry(){
state.cry();
}
public void say(){
state.say();
}
}
测试类:
package com.example.dtest.design23.state.state02;
public class StateTest02 {
public static void main(String[] args) {
MM mm = new MM();
// 设置状态为开心
mm.state = new MMHappyState();
mm.smile();
mm.cry();
mm.say();
// 改变状态为Sad
mm.state = new MMSadState();
System.out.println("------------改变状态为Sad----------------");
// 调用方法
mm.smile();
mm.cry();
mm.say();
}
}