(18)ステータスモード
状態パターンを使用すると、オブジェクトの内部状態が変化したときにオブジェクトの状態を変更でき、クラスの動作はその状態に基づいて変化します。
1.状態パターンの設計原理
1.コンテキスト:クライアントに必要なインターフェースを定義し、現在の状態インスタンスを内部的に維持し、状態の切り替えを担当します。
2.抽象状態(IState):状態の動作を定義します。
3.作成:具体的な状態の動作。
2.簡単な例
コミュニティの記事を読むときは、コメントや収集などの操作をログイン状態で行う必要があります。そうしないと、ログインページに一律にジャンプします。次に、状態パターンを使用して上記のシナリオを実現します。
public abstract class UserState {
// 状态接口需要维护一个context
protected AppContext appContext;
public void setAppContext(AppContext appContext) {
this.appContext = appContext;
}
public abstract void favorite();
public abstract void comment(String comment);
}
public class LoginState extends UserState {
@Override
public void favorite() {
System.out.println("收藏成功!");
}
@Override
public void comment(String comment) {
System.out.println(comment);
}
}
public class UnLoginState extends UserState {
// 未登录状态下的行为多了一个切换操作
@Override
public void favorite() {
this.switch2Login();
this.appContext.getState().favorite();
}
@Override
public void comment(String comment) {
this.switch2Login();
this.appContext.getState().favorite();
}
// 切换到登录
public void switch2Login(){
System.out.println("跳转到登录页面!");
this.appContext.setState(this.appContext.STATE_LOGIN);
}
}
public class AppContext {
// context内部维护两种状态
public static final UserState STATE_LOGIN = new LoginState();
public static final UserState STATE_UNLOGIN = new UnLoginState();
private UserState currentState = STATE_UNLOGIN;
// 代码块初始化状态对应的context
{
STATE_LOGIN.setAppContext(this);
STATE_UNLOGIN.setAppContext(this);
}
// 设置状态,同时设置当前状态的context
public void setState(UserState state){
this.currentState = state;
this.currentState.setAppContext(this);
}
public UserState getState(){
return this.currentState;
}
// 内部需要维护当前状态的方法
public void favorite(){
this.currentState.favorite();
}
public void comment(String comment){
this.currentState.comment(comment);
}
}
public class Client {
public static void main(String[] args) {
AppContext appContext = new AppContext();
appContext.favorite();
appContext.comment("我赞!");
}
}
跳转到登录页面!
收藏成功!
我赞!
3.ステータスモードに関するコメント
状態モードは、遷移の詳細を適切にカプセル化するコンテキストを介して状態を切り替えます。しかし、彼は開放閉鎖原則に違反しており、すべての州を知っている必要があります。
Chain of Responsibilityモデルと比較すると、State Model状態は次の状態を認識しますが、Chain of Responsibilityモデルは認識せず、クライアントにカプセル化されます。
ストラテジーモードと比較すると、ステートモードは相互に関連しており、ストラテジーは互いに独立しています。