概念:
状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为模式。状态模式允许一个对象在其内部状态改变的时候改变其行为。这个对象看上去就像是改变了它的类一样。状态模式有两个要点:1、可以通过改变状态来获得不同的行为。2、外面对状态的知晓。
案例:
某论坛网站主页,根据访问者的身份,显示不同的页面。
先来看类关系图:
详细代码:
首先定义状态接口:其包括一个待实现的方法showPage()
public interface State { public void showPage(); }
接着定义三种身份状态类,实现上面接口:
游客状态:
public class VisitState implements State {
@Override
public void showPage() {
System.out.println("showVisitPage()");
}
}
会员用户状态:
public class UserState implements State {
@Override
public void showPage() {
System.out.println("showUserPage()");
}
}
论坛管理状态:
public class AdminState implements State {
@Override
public void showPage() {
System.out.println("showAdminPage()");
}
}
接着定义访问者类: 内部持有一个State状态
public class Viewer { private State state; public State getState() { return state; } public void setState(State state) { this.state = state; } public Viewer(State state) { this.state = state; } }
public class WebSiteMainPage { private Viewer viewer; public WebSiteMainPage(Viewer viewer) { this.viewer = viewer; } public Viewer getViewer() { return viewer; } public void setViewer(Viewer viewer) { this.viewer = viewer; } public void showPage() { if (null != getViewer() && null != getViewer().getState()) { getViewer().getState().showPage(); } } }
写测试类,进行测试:
public class WorkClass { public void test() { WebSiteMainPage webSiteMainPage = new WebSiteMainPage(new Viewer(new VisitState())); webSiteMainPage.showPage();//用户身份登录 webSiteMainPage.getViewer().setState(new UserState()); webSiteMainPage.showPage();
//管理员身份登录 webSiteMainPage.getViewer().setState(new AdminState()); webSiteMainPage.showPage(); } }
测试结果:
I/System.out: showVisitPage() I/System.out: showUserPage() I/System.out: showAdminPage()