状态模式
一、简介
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
状态模式中的行为取决于其所处状态,不同状态下有不同的行为。状态模式和策略模式结构几乎一模一样但是它们的目的和本质却完全不同。状态模式的行为是平行的不可替换的,策略模式的行为是彼此相互独立可以相互替换的。
我的理解就是策略模式是人为指定某种策略以用来解决某个问题,状态模式则根据状态来决定其行为,其状态是满足一定条件自动改变的而不是人为指定的,所以状态模式下对象对自己的状态的改变应该是“无意识”。策略模式注重不同算法完成相同的功能,状态模式侧重不同状态行为不同。
二、适用场景
- 一个对象的行为取决于它的状态,且在其状态发生改变后行为也会随之改变。
- 代码中包含大量与对象状态有关的语句
三、简单实现
这里以app账户的登录/退出为例说明状态模式,一般来说app用户登录之后可以做一些未登录状态下不能完成的功能,比如未登录用户只能浏览不能收藏,登录用户则既可以浏览又可以收藏。
//状态类
public interface Status{
void browse();
void collect();
}
public class LoginStatus implements Status{
@Override
public void browse() {
Log.i(TAG, "browse: login");
}
@Override
public void collect() {
Log.i(TAG, "collect: login");
}
}
public class LogoutStatus implements Status{
@Override
public void browse() {
Log.i(TAG, "browse: logout");
}
@Override
public void collect() {
Log.i(TAG, "collect: logout can not collect");
}
}
//登录状态类
public class LoginContext{
private Status status;
public void setStatus(Status status) {
this.status = status;
}
public void browse(){
this.status.browse();
}
public void collect(){
this.status.collect();
}
}
//使用
public void main(){
LoginContext loginContext=new LoginContext();
loginContext.setStatus(new LogoutStatus());
loginContext.browse();
loginContext.collect();
loginContext.setStatus(new LoginStatus());
loginContext.browse();
loginContext.collect();
}
四、小结
需要注意与策略模式的区别