状态模式:
允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。
使用场景
行为随状态改变而改变的场景
代码中包含大量与对象状态有关的条件语句,且分支依赖于对象的状态。
优点:
1.将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为。
2.封装了转换规则。
3.允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块。
缺点:
1.状态模式的使用必然会增加系统类和对象的个数
2.状态模式对"开闭原则"的支持并不太好,对于可以切换状态的状态模式,增加新的状态类需要修改那些负责状态转换的源代码,否则无法切换到新增状态,而且修改某个状态类的行为也需修改对应类的源代码。
package 状态模式_实战;
public class 状态模式实战 {
public static void main(String[] args) {
LoginContext.getLoginContext().forward("转发内容");
LoginContext.getLoginContext().setUserState(new LoginInState());
LoginContext.getLoginContext().forward("哈哈哈哈");
}
}
package 状态模式_实战;
public class LoginContext {
UserState mUserState = new LoginOutState();
static LoginContext context = new LoginContext();
public static LoginContext getLoginContext() {
return context;
}
public void setUserState(UserState state) {
mUserState = state;
}
public UserState getUserState() {
return mUserState;
}
public void comment(String content) {
mUserState.comment(content);
}
public void forward(String content) {
mUserState.forward(content);
}
}
package 状态模式_实战;
public class LoginInState implements UserState {
public LoginInState() {
System.out.println("已登录");
}
@Override
public void forward(String content) {
// TODO Auto-generated method stub
System.out.println("转发的内容为:"+ content);
}
@Override
public void comment(String content) {
// TODO Auto-generated method stub
System.out.println("评论的内容为:"+content);
}
}
package 状态模式_实战;
public class LoginOutState implements UserState {
public LoginOutState() {
System.out.println("未登录");
}
@Override
public void forward(String content) {
// TODO Auto-generated method stub
gotoLogin();
}
@Override
public void comment(String content) {
// TODO Auto-generated method stub
gotoLogin();
}
public void gotoLogin() {
System.out.println("当前用户还未登陆,请先登录");
}
}
package 状态模式_实战;
public interface UserState {
void forward(String content);
void comment(String content);
}
package 状态模式;
public class 状态模式 {
public static void main(String[] args) {
TVController controller = new TVController();
controller.powerOn();
controller.nextChannel();
controller.preChannel();
controller.turnDown();
controller.powerOff();
controller.preChannel();
controller.powerOn();
}
}
package 状态模式;
public interface PowerController {
public void powerOn();
public void powerOff();
}
package 状态模式;
public class PowerOffState implements TVState {
@Override
public void nextChannel() {
// TODO Auto-generated method stub
}
@Override
public void preChannel() {
// TODO Auto-generated method stub
}
@Override
public void turnUp() {
// TODO Auto-generated method stub
}
@Override
public void turnDown() {
// TODO Auto-generated method stub
System.out.println("电源关闭");
}
}
package 状态模式;
public class PowerOnState implements TVState {
@Override
public void nextChannel() {
// TODO Auto-generated method stub
System.out.println("下一个频道");
}
@Override
public void preChannel() {
// TODO Auto-generated method stub
System.out.println("上一个频道");
}
@Override
public void turnUp() {
// TODO Auto-generated method stub
System.out.println("电源开启");
}
@Override
public void turnDown() {
// TODO Auto-generated method stub
System.out.println("电源关闭");
}
}
package 状态模式;
public class TVController implements PowerController {
private TVState mTvstate;
public void setTvState(TVState state) {
mTvstate = state;
}
@Override
public void powerOn() {
// TODO Auto-generated method stub
setTvState(new PowerOnState());
mTvstate.turnUp();
}
@Override
public void powerOff() {
// TODO Auto-generated method stub
setTvState(new PowerOffState());
mTvstate.turnDown();
}
public void nextChannel() {
mTvstate.nextChannel();
}
public void preChannel() {
mTvstate.preChannel();
}
public void turnDown() {
mTvstate.turnDown();
}
public void turnOn() {
mTvstate.turnUp();
}
}
package 状态模式;
public interface TVState {
public void nextChannel();
public void preChannel();
public void turnUp();
public void turnDown();
}