状态模式中,状态之间的转移可以是网状的关系;责任链中节点的关系是链状关系。
状态模式中,状态转移是在类的设计阶段就定好的;而责任链的下一级是由客户端动态确定的。
将能够处理同一类请求的对象连成一条链,请求在这个链上传递,直到链上的某一个对象决定处理此请求。
JavaScript中的时间冒泡和捕获机制
意图:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。
播放器有 ▶ 和 ■ 两个按钮,三个状态 Playing,Paused,Stopped;
// ┌──→ Stopped ←──┐
// │ ┌─┘ │
// │ ↓ │
// Playing ←─── Paused
// │ ↑
// └───────────┘
public interface PlaybackState{
public void playOrPause(Context c);
public void stop(Context c);
}
public class PlayingState implements PlaybackState{
public void playOrPause(Context c){
c.changeBtnImgToPlay();
c.setState(new PausedState());
}
public void stop(Context c){
c.changeBtnImgToPlay();
c.setState(new StoppedState());
}
}
public class StoppedState implements PlaybackState{
public void playOrPause(Context c){
c.changeBtnImgToPause();
c.setState(new PlayingState());
}
public void stop(Context c){
// ignore
}
}
public class PausedState implements PlaybackState{
public void playOrPause(Context c){
c.changeBtnImgToPause();
c.setState(new PlayingState());
}
public void stop(Context c){
c.setState(new StoppedState());
}
}
public class Context{
private PlaybackState state = new StoppedState();
public void setState(State state){
this.state = state;
}
public void playPauseBtnOnClick(){
state.playOrPause();
}
public void stopBtnOnClick(){
state.stop();
}
public void changeBtnImgToPause(){
// 把按钮图标换成暂停图标
}
public void changeBtnImgToPlay(){
// 把按钮图标换成播放图标
}
}