「JAVAとモデル」ステートモード

初め「とJAVAモード」で、市ヤンHongboブックは状態(ステート)モードについて説明します。

(国のためのオブジェクトのパターン)対象パターンの状態として知られている状態モデル、行動パターンモデルオブジェクトの状態。

モードの状態は、オブジェクトが自分の行動を変えるために、その内部状態を変更することができますとき。オブジェクトが同じクラスを変更することがあるようにこれが見えます。

設定の状態パターンの
  文が異なる状態でのパッケージオブジェクト内のオブジェクトの挙動を研究する状態パターンを表現するために、各状態オブジェクトは、抽象状態クラスのサブクラスに属します。その意図は、彼らの行動が変化したとき、その内部状態での状態モデルオブジェクトの変更を行うことです。状態パターンのクラス図を模式的としては、以下:
  ここに画像を挿入説明
キャラクターのステータスモードが関与しています:

●環境(コンテキスト)の役割、また文脈そのまま:インタフェース定義クライアントが興味を持っている、状態クラスの特定のインスタンスを保持します。この特定のクラスの例は、この環境内のオブジェクトの現在の状態の状態が与えられます。

●抽象状態(ステート)の役割:ターゲットの行動に対応する特定のパッケージの環境状況(コンテキスト)のためのインタフェースを定義します。

●特定の状態(ConcreteState)役割:すべての具象状態クラスは状態に対応する行動の環境(コンテキスト)を実装。

ソース
  環境のクラスの役割

public class Context {
    //持有一个State类型的对象实例
    private State state;

    public void setState(State state) {
        this.state = state;
    }
    /**
     * 用户感兴趣的接口方法
     */
    public void request(String sampleParameter) {
        //转调state来处理
        state.handle(sampleParameter);
    }
}

抽象状態クラス

public interface State {
    /**
     * 状态对应的处理
     */
    public void handle(String sampleParameter);
}

特殊ステータスクラス

public class ConcreteStateA implements State {

    @Override
    public void handle(String sampleParameter) {
        
        System.out.println("ConcreteStateA handle :" + sampleParameter);
    }

}
public class ConcreteStateB implements State {

    @Override
    public void handle(String sampleParameter) {
        
        System.out.println("ConcreteStateB handle :" + sampleParameter);
    }

}

Clientクラス

public class Client {

    public static void main(String[] args){
        //创建状态
        State state = new ConcreteStateB();
        //创建环境
        Context context = new Context();
        //将状态设置到环境中
        context.setState(state);
        //请求
        context.request("test");
    }
}

上記から分かるように、環境コンテキスト要求の動作は()クラスの特定の状態に割り当てられます。多型の原理を利用して、動的に国家環境コンテキストのプロパティの内容を変更することができ、そして、他の点クラス状態に特定の状態のカテゴリを指しから変換するように異なることにより、特定の状態の環境クラス要求の挙動()実行するためのクラス。

使用シナリオは
  、ユーザーが繰り返し投票場合、唯一の一票を制御することができ、同じユーザーを達成するために、オンライン投票システムの適用を考慮し、5回以上の投票数が、悪質なブラシの投票、投票はもちろん、ユーザーの資格を剥奪することが決定されました彼はまた、投票をキャンセルする必要があります。8倍以上のユーザーの投票回数場合は、ブラックリストに入り、その後、ログインし、システムを使用禁止します。

ブラックリストに通常の投票、繰り返し投票、悪意のあるブラシ投票、:状態パターンの実装を使用するには、まず、大きく4つの状態に分けて上記の説明によると、投票プロセスのうちのさまざまな状態を定義する必要があります。そして、投票管理オブジェクト(コンテキストに相当)を作成します。

システム構成図を次のように
  ここに画像を挿入説明
  ソース
  抽象クラス状態を

public interface VoteState {
    /**
     * 处理状态对应的行为
     * @param user    投票人
     * @param voteItem    投票项
     * @param voteManager    投票上下文,用来在实现状态对应的功能处理的时候,
     *                         可以回调上下文的数据
     */
    public void vote(String user,String voteItem,VoteManager voteManager);
}

特定のクラスのステータス - 通常の投票

public class NormalVoteState implements VoteState {

    @Override
    public void vote(String user, String voteItem, VoteManager voteManager) {
        //正常投票,记录到投票记录中
        voteManager.getMapVote().put(user, voteItem);
        System.out.println("恭喜投票成功");
    }

}

特定のクラスの状態 - 繰り返し投票

public class RepeatVoteState implements VoteState {

    @Override
    public void vote(String user, String voteItem, VoteManager voteManager) {
        //重复投票,暂时不做处理
        System.out.println("请不要重复投票");
    }

}

特定の状態のクラス - 悪意のあるブラシ票

public class SpiteVoteState implements VoteState {

    @Override
    public void vote(String user, String voteItem, VoteManager voteManager) {
        // 恶意投票,取消用户的投票资格,并取消投票记录
        String str = voteManager.getMapVote().get(user);
        if(str != null){
            voteManager.getMapVote().remove(user);
        }
        System.out.println("你有恶意刷屏行为,取消投票资格");
    }

}

特定のクラスのステータス - ブラックリスト

public class BlackVoteState implements VoteState {

    @Override
    public void vote(String user, String voteItem, VoteManager voteManager) {
        //记录黑名单中,禁止登录系统
        System.out.println("进入黑名单,将禁止登录和使用本系统");
    }

}

環境の

public class VoteManager {
    //持有状体处理对象
    private VoteState state = null;
    //记录用户投票的结果,Map<String,String>对应Map<用户名称,投票的选项>
    private Map<String,String> mapVote = new HashMap<String,String>();
    //记录用户投票次数,Map<String,Integer>对应Map<用户名称,投票的次数>
    private Map<String,Integer> mapVoteCount = new HashMap<String,Integer>();
    /**
     * 获取用户投票结果的Map
     */
    public Map<String, String> getMapVote() {
        return mapVote;
    }
    /**
     * 投票
     * @param user    投票人
     * @param voteItem    投票的选项
     */
    public void vote(String user,String voteItem){
        //1.为该用户增加投票次数
        //从记录中取出该用户已有的投票次数
        Integer oldVoteCount = mapVoteCount.get(user);
        if(oldVoteCount == null){
            oldVoteCount = 0;
        }
        oldVoteCount += 1;
        mapVoteCount.put(user, oldVoteCount);
        //2.判断该用户的投票类型,就相当于判断对应的状态
        //到底是正常投票、重复投票、恶意投票还是上黑名单的状态
        if(oldVoteCount == 1){
            state = new NormalVoteState();
        }
        else if(oldVoteCount > 1 && oldVoteCount < 5){
            state = new RepeatVoteState();
        }
        else if(oldVoteCount >= 5 && oldVoteCount <8){
            state = new SpiteVoteState();
        }
        else if(oldVoteCount > 8){
            state = new BlackVoteState();
        }
        //然后转调状态对象来进行相应的操作
        state.vote(user, voteItem, this);
    }
}

Clientクラス

public class Client {

    public static void main(String[] args) {
        
        VoteManager vm = new VoteManager();
        for(int i=0;i<9;i++){
            vm.vote("u1","A");
        }
    }

}

結果は以下の通りである:
ここに画像を挿入説明
上記の例から分かるように、遷移状態は、基本的には、内部動作、内部状態を維持するためのメインモードです。人々が投票するために、例えば、彼の操作のいずれかの時点で投票するですが、投票プロセスは、状態が得票数に応じて判断され、その後、状態に応じて異なる処理を選択することが、必ずしも管理対象オブジェクトと同じではありません。

認識状態モード
  ●状態と振る舞い

一般に、オブジェクト・インスタンスの属性の値を参照し、オブジェクトの状態、いわゆる、オブジェクト関数の挙動を参照し、具体的には、方法のほとんどの動作に対応してもよいです。

異なる機能に対応する異なる状態を呼び出すために、変化の状態を維持することにより、状態から分離されている行動の機能的状態パターン。状態が行動することを決めた。言い換えると、状態と動作が関連付けられている、彼らの関係を記述することができます。

状態以来実行時に変更されるので、その動作は、状態の変化に基づいて実行時に変更することができます。

●並列動作

むしろ、平等よりもその平行線に注意してください。いわゆる平行度が異なる状態に応じて、平行線に行き、最終的に決定することは関連がありません、互いに独立して、レベルが同じである各状態の動作を指します。挙動が異なる、もちろん、対応する実装は、互いに交換可能でない異なります。
  ここに画像を挿入説明
  代替をすることができ平等同じ動作が発生した場合に、あなたは状況に応じて適切な治療のいずれかを実装することを選択することができるように、彼らは、同法の異なる説明をしているかを達成することを強調しました。
  ここに画像を挿入説明
  あなたは、戦略パターンの状態の構造とモードの構造がまったく同じであることを見つけるかもしれないが、彼らは達成を目指しますが、本質は完全に異なっています。状態モデルと戦略モード間の行動特性は、状態モデルの挙動と非常に重要な違いは、平行がお互いを置き換えることはできません、自然界にも存在しているされている;およびポリシーモードは、本質的に同じで行い、それを交換することができます。

●環境や処理対象の状態

状態モードでは、環境(コンテキスト)は、オブジェクトの状態に保持されているが、環境(コンテキスト)自体は、状態依存挙動を扱っていないが、状態の処理状況に委託機能を処理するために処理クラスの状態に対応します。

パラメータとして環境(コンテキスト)、従って、典型的には周囲(コンテキスト)自体が特定の状態に渡されたときにしばしば必要となるにも補正する方法において、特定の状態のカテゴリ環境(コンテキスト)自身のデータ処理を取得する必要が処理クラス。

一般的に、クライアントと環境(コンテキスト)の相互作用。クライアントは、一度設定され、あなたがもはや必要とオブジェクトの状態に対処するために、ステータスオブジェクト環境(コンテキスト)を設定するために使用することはできません。クライアントは通常、最終的にフォローアップ時の動作の状態を維持するための責任を負いませんプロセスを使用して特定のオブジェクトをどの状態決定のための責任を負いません。

記事から:https://www.cnblogs.com/java-my-life/archive/2012/06/08/2538146.html

おすすめ

転載: blog.csdn.net/weixin_41490593/article/details/90513003