概述
當(dāng)一個(gè)對(duì)象的內(nèi)在狀態(tài)改變時(shí)允許改變其行為,這個(gè)對(duì)象看起來(lái)像是改變了其類(lèi)。
狀態(tài)模式的實(shí)現(xiàn)
通過(guò)狀態(tài)模式來(lái)實(shí)現(xiàn)一個(gè)控制器,有登錄和未登錄兩個(gè)狀態(tài)和點(diǎn)贊、評(píng)論、轉(zhuǎn)發(fā)三個(gè)功能。
登錄狀態(tài):提示點(diǎn)贊成功,提示評(píng)論成功,提示轉(zhuǎn)發(fā)成功。
未登錄狀態(tài):提示點(diǎn)贊失敗請(qǐng)登錄,提示評(píng)論失敗請(qǐng)登錄,提示轉(zhuǎn)發(fā)失敗請(qǐng)登錄
1.定義一個(gè)狀態(tài)接口
public interface IState {
void login();
void logout();
}
2.定義一個(gè)控制接口
public interface IController {
void upvote();
void comment();
void share();
}
3.實(shí)現(xiàn)一個(gè)登錄狀態(tài)的控制器
public class LoginController implements IController{
@Override
public void upvote() {
System.out.println("點(diǎn)贊成功");
}
@Override
public void comment() {
System.out.println("評(píng)論成功");
}
@Override
public void share() {
System.out.println("分享成功");
}
}
4.實(shí)現(xiàn)一個(gè)未登錄狀態(tài)的控制器
public class LogoutController implements IController{
@Override
public void upvote() {
System.out.println("點(diǎn)贊失敗,請(qǐng)登錄");
}
@Override
public void comment() {
System.out.println("評(píng)論失敗,請(qǐng)登錄");
}
@Override
public void share() {
System.out.println("分享失敗,請(qǐng)登錄");
}
}
5.實(shí)現(xiàn)控制器
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.測(cè)試類(lèi)
public class Client {
public static void main(String[] args) {
Controller mController=new Controller();
mController.logout();//未登錄狀態(tài)
System.out.println("**************未登錄************");
mController.upvote();
mController.comment();
mController.share();
mController.login();//登錄狀態(tài)
System.out.println("**************已登錄************");
mController.upvote();
mController.comment();
mController.share();
}
}
打印結(jié)果:
image.png