当行为取决于状态时可以使用状态模式,比如和登录相关的进入收藏,购物车,发起评论之类的按钮。可用于解决if-else和switch逻辑。
状态模式更偏向于状态引起的一些行为的改变。策略模更偏向于使用不同的算法来实现一个功能。
public interface UserState {
/**
* 购物车
*/
public void shoppingCart();
/**
* 评论
*/
public void comment();
}
public class LoginedState implements UserState{
@Override
public void shoppingCart() {
System.out.println("打开购物车");
}
@Override
public void comment() {
System.out.println("评论");
}
}
public class LogoutState implements UserState{
@Override
public void shoppingCart() {
System.out.println("请先登录");
}
@Override
public void comment() {
System.out.println("请先登录");
}
}
public class LoginContext {
/**
* 用户状态,默认未登录
*/
UserState userState = new LoginedState();
/**
* 单例
*/
private volatile static LoginContext loginContext = null;
private LoginContext() {
}
public static LoginContext getInstance() {
if (loginContext == null) {
synchronized (LoginContext.class) {
if (loginContext == null) {
loginContext = new LoginContext();
}
}
}
return loginContext;
}
public void setUserState(UserState userState){
this.userState = userState;
}
public void shoppingCart(){
userState.shoppingCart();
}
public void comment(){
userState.comment();
}
}
测试:
LoginContext.getInstance().shoppingCart();
LoginContext.getInstance().comment();
LoginContext.getInstance().setUserState(new LogoutState());
LoginContext.getInstance().shoppingCart();
LoginContext.getInstance().comment();
输出:
System.out: 打开购物车
System.out: 评论
System.out: 请先登录
System.out: 请先登录