设计模式之状态模式

状态模式的定义是:当一个对象内在状态改变时允许其改变行为,这个对象看起来像是改变了自身所属的类。

该模式适合于对象具有有限的状态,并且在状态之间相互切换。

例如使用如下的条件分支语句也是属于状态的切换:

switch (action){  
    case "play":  
        state="playing";  
        break;    
    case "stop":  
        state="stopping";  
        break;
}

当后期状态增多和状态转换复杂之后,使用这种方式会对后续的维护增加困难。使用状态模式能有效解决这种维护的困难,通过将与状态相关的行为抽取到独立的状态类中, 让原对象将工作委派给这些类的实例, 而不是自行进行处理,将复杂度隔离在状态类中。

该模式中存在 3 类对象:

  1. Context 上下文:保持有状态类的引用
  2. State 抽象状态:定义状态的方法
  3. ConcreteState 具体状态
Context
- state
-changeState()
«interface»
State
+action()
ConcreteState
+action()

代码实现:

//抽象状态
public abstract class State {  
    protected Player player;  
  
    public State(Player player) {  
        this.player = player;  
    }  
  
    // 停止  
    public abstract void onStop();  
    // 播放  
    public abstract void onPlay();  
}
//具体状态:停止状态
public class StoppingState extends State{  
    public StoppingState(Player player) {  
        super(player);  
    }  
  
    @Override  
    public void onStop() {  
        System.out.println("已经停止");  
    }  
  
    @Override  
    public void onPlay() {  
        player.setState(new PlayingState(player));  
        player.setPlaying(true);  
    }  
}

// 具体状态:播放状态
public class PlayingState extends State {  
    public PlayingState(Player player) {  
        super(player);  
    }  
  
    @Override  
    public void onStop() {  
        player.setState(new StoppingState(player));  
        player.setPlaying(false);  
    }  
  
    @Override  
    public void onPlay() {  
        System.out.println("已经在播放");  
    }  
}
//上下文对象
@Data  
public class Player {  
    private State state;  
    private boolean playing;  
}
Player player=new Player();  
//设置初始状态  
player.setState(new StoppingState(player));  
//播放  
player.getState().onPlay();  
System.out.println(player.getState());  
//停止  
player.getState().onStop();  
System.out.println(player.getState());

状态模式的优点是:

  1. 消除了复杂的条件分支语句
  2. 将状态相关的行为封装在状态类中

缺点是如果状态太少,使用状态模式会显得过于复杂。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值