概述
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
状态模式的实现
通过状态模式来实现一个控制器,有登录和未登录两个状态和点赞、评论、转发三个功能。
登录状态:提示点赞成功,提示评论成功,提示转发成功。
未登录状态:提示点赞失败请登录,提示评论失败请登录,提示转发失败请登录
1.定义一个状态接口
public interface IState {
void login();
void logout();
}
2.定义一个控制接口
public interface IController {
void upvote();
void comment();
void share();
}
3.实现一个登录状态的控制器
public class LoginController implements IController{
@Override
public void upvote() {
System.out.println("点赞成功");
}
@Override
public void comment() {
System.out.println("评论成功");
}
@Override
public void share() {
System.out.println("分享成功");
}
}
4.实现一个未登录状态的控制器
public class LogoutController implements IController{
@Override
public void upvote() {
System.out.println("点赞失败,请登录");
}
@Override
public void comment() {
System.out.println("评论失败,请登录");
}
@Override
public void share() {
System.out.println("分享失败,请登录");
}
}
5.实现控制器
public class Controller implements IController, IState {
private IController mController;
public void setController(IController controller) {
mController = controller;
}
@Override
public void upvote() {
mController.upvote();
}
@Override
public void comment() {
mController.comment();
}
@Override
public void share() {
mController.share();
}
@Override
public void login() {
setController(new LoginController());
}
@Override
public void logout() {
setController(new LogoutController());
}
}
6.测试类
public class Client {
public static void main(String[] args) {
Controller mController=new Controller();
mController.logout();//未登录状态
System.out.println("**************未登录************");
mController.upvote();
mController.comment();
mController.share();
mController.login();//登录状态
System.out.println("**************已登录************");
mController.upvote();
mController.comment();
mController.share();
}
}
打印结果:
image.png
网友评论