1.前言
- 设计模式共有23种(点击这里查看更多分类),根据目的准则分类,分为三类
- 创建型设计模式,共5种:单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。
- 结构型设计模式,共7中:适配器模式、装饰模式、代理模式、外观模式、桥接模式、组合模式、响元模式。
- 行为设计模式,共11种:策略模式、模版方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
- 这里介绍一下状态模式。
2.特点
- 定义:允许一个对象在其内部改变时改变它的行为,对象看起来像是修改了它的类。
- 解释:状态模式有如下几种角色
- StudyContext:上下文环境。定义了最终调用模块需要的接口且维护了具体状态的实例,将状态相关的操作委托给具体类来处理。
- StudyLanguage、StudyMath、StudyPhysic:具体类。实现接口类的方法。
- Study:接口类。定义一个接口以封装使用上下文环境的的一个特定状态相关的行为
代码说明
定义接口类Study,如下:
public interface Study {
void plan(StudyContext context);
}
定义具体类StudyLanguage、StudyMath、StudyPhysic,如下:
public class StudyLanguage implements Study {
@Override
public void plan(StudyContext context) {
System.out.println("计划上午学习语文...实际上一觉睡到中午");
context.setStudy(new StudyMath());
}
}
public class StudyMath implements Study {
@Override
public void plan(StudyContext context) {
System.out.println("计划下午学习数学...实际上打了一下午篮球");
context.setStudy(new StudyPhysic());
}
}
public class StudyPhysic implements Study {
@Override
public void plan(StudyContext context) {
System.out.println("计划晚上学习物理...实际上打游戏打到困");
}
}
定义上下文环境类StudyContext,如下:
public class StudyContext {
private Study mStudy;
public Study getStudy() {
return mStudy;
}
public void setStudy(Study study) {
mStudy = study;
mStudy.plan(this);
}
}
最终调用,如下:
StudyContext context = new StudyContext();
StudyLanguage language = new StudyLanguage();
context.setStudy(language);
//打印日志
System.out: 计划上午学习语文...实际上一觉睡到中午
System.out: 计划下午学习数学...实际上打了一下午篮球
System.out: 计划晚上学习物理...实际上打游戏打到困
2.2.优缺点
- 优点:封装性良好;将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为。
- 缺点:不符合“开闭原则”的设计思想。
2.3.使用场景
- 行为随着状态的改变而改变。
3.总结
有疑问可以留言!