兄弟们,老铁们.又到了学习锻炼我们可爱小小大脑的时候了~~~~~ 今天继续来学习设计模式,正所谓一天一个效果不错!!
喝了这碗鸡血,学就完了~~~
学习是为了长大后遇到自己喜欢的人的时候吧不自惭形愧。能光鲜亮丽的出现。
1.状态模式定义
GOF中给状态模式的定义为:允许一个对象在其内部状态改变时改变它的行为.
能够让程序根据不同的外部情况来做出不同的响应,最简单的方法就是在程序中使用 if else来讲可能发生的外部情况全部考虑到再通过判断进行选择响应.但是这种方法对于发咋的状态判断就会变得混乱容易产生错误.而增加一个新的状态也会带来大量的修改.
2.状态模式结构
状态模式可以有效地替换程序中的if else语句:将不同条件下的行为封装在一个类里面,再给这些类一个统一的父类来进行约束.
- 使用环境(Context)角色:客户程序是通过它来满足自己的需求.它定义了客户程序需要的接口,并且维护一个具体状态角色的实例,这个实例来决定当前的状态.
- 状态(State)角色:定义一个接口以封装与使用环境角色的一个特定状态相关的行为.
- 具体状态(Concrete State)角色:实现状态角色定义的接口.

3.实现
一个电视机有两种状态,关机状态和开机状态.关机状态只能开机,开机状态可以上下换台和关机.
抽象状态类
public interface State {
/**
* 开机
*/
void onState();
/**
* 关机
*/
void offState();
/**
* 上一个频道
*/
void previousState();
/**
* 下一个频道
*/
void nextState();
}
电视机类
public class TV {
//起始状态
private State state;
//关机状态
private State offState;
//开机状态
private State onState;
//起始状态为关机
public TV(){
offState = new OffState(this);
onState = new OnState(this);
state = offState;
}
//关机
public void offState(){
state.offState();
}
//下一个频道
public void next(){
state.nextState();
}
//上一个频道
public void previousState(){
state.previousState();
}
//开机
public void onState(){
state.onState();
}
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
public State getOffState() {
return offState;
}
public void setOffState(State offState) {
this.offState = offState;
}
public State getOnState() {
return onState;
}
public void setOnState(State onState) {
this.onState = onState;
}
}
关机状态类
public class OffState implements State {
TV tv;
public OffState(TV tv){
this.tv = tv;
}
@Override
public void onState() {
System.out.println("电视开机:欢迎~~~");
//状态变为开机
tv.setState(tv.getOnState());
}
@Override
public void offState() {
//无操作
}
@Override
public void previousState() {
//无操作
}
@Override
public void nextState() {
//无操作
}
}
开机状态类
public class OnState implements State{
TV tv;
public OnState(TV tv){
this.tv = tv;
}
@Override
public void onState() {
//无操作
}
@Override
public void offState() {
System.out.println("电视关机:欢迎下次观看~~~~~");
tv.setState(tv.getOnState());
}
@Override
public void previousState() {
System.out.println("进入------上一个频道");
tv.setState(tv.getOnState());
}
@Override
public void nextState() {
System.out.println("进入------下一个频道");
tv.setState(tv.getOnState());
}
}
测试类
public static void main(String[] args) {
TV tv = new TV();
tv.onState();
tv.next();
tv.previousState();
tv.offState();
}
输出
电视开机:欢迎~~~
进入------下一个频道
进入------上一个频道
电视关机:欢迎下次观看~~~~~

本文深入解析状态模式,探讨其在程序设计中的应用。通过电视机开关机状态实例,展示如何使用状态模式封装不同状态下对象的行为,避免复杂的if-else判断,提高代码的可读性和可维护性。
291

被折叠的 条评论
为什么被折叠?



