概述
當一個對象的內在狀態改變時允許改變其行為,這個對象看起來像是改變了其類。
狀態模式的實現
通過狀態模式來實現一個控制器,有登錄和未登錄兩個狀態和點贊、評論、轉發三個功能。
登錄狀態:提示點贊成功,提示評論成功,提示轉發成功。
未登錄狀態:提示點贊失敗請登錄,提示評論失敗請登錄,提示轉發失敗請登錄
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