横たわるデザインパターンのノート(XIII)の状態モード

栗のために

問題の説明

仕事の日、朝、良好な状態、睡眠への正午、午後には緩やかな回復、残業苦い苦しみ。異なる作業条件に応じて、時間を反映しています。

単純な実装

作業

/**
 * 工作类
 * Created by callmeDevil on 2019/8/3.
 */
public class Work {

    private int hour;
    private boolean finish = false;

    public void writeProgram() {
        if (hour < 12) {
            System.out.println(String.format("当前时间:%s点,上午工作,精神百倍", hour));
        } else if (hour < 13) {
            System.out.println(String.format("当前时间:%s点,饿了,午饭;犯困,午休", hour));
        } else if (hour < 17) {
            System.out.println(String.format("当前时间:%s点,下午状态还不错,继续努力", hour));
        } else {
            if (finish) {
                System.out.println(String.format("当前时间:%s点,下班回家了", hour));
            } else {
                if (hour < 21) {
                    System.out.println(String.format("当前时间:%s点,加班哦,疲累至极", hour));
                } else {
                    System.out.println(String.format("当前时间:%s点,不行了,睡着了", hour));
                }
            }
        }
    }

    // 省略 get set 方法

}

テスト

public class Test {
    public static void main(String[] args) {
        // 紧急项目
        Work emergencyProjects = new Work();
        emergencyProjects.setHour(9);
        emergencyProjects.writeProgram();
        emergencyProjects.setHour(10);
        emergencyProjects.writeProgram();
        emergencyProjects.setHour(11);
        emergencyProjects.writeProgram();
        emergencyProjects.setHour(12);
        emergencyProjects.writeProgram();
        emergencyProjects.setHour(13);
        emergencyProjects.writeProgram();
        emergencyProjects.setHour(14);
        emergencyProjects.writeProgram();
        emergencyProjects.setHour(17);
        emergencyProjects.writeProgram();
        emergencyProjects.setHour(19);
        emergencyProjects.writeProgram();
        emergencyProjects.setHour(22);
        emergencyProjects.writeProgram();
        System.out.println("--------------------------");
        emergencyProjects.setFinish(true);
        emergencyProjects.setHour(19);
        emergencyProjects.writeProgram();
        emergencyProjects.setHour(22);
        emergencyProjects.writeProgram();
    }
}

テスト結果

当前时间:9点,上午工作,精神百倍
当前时间:10点,上午工作,精神百倍
当前时间:11点,上午工作,精神百倍
当前时间:12点,饿了,午饭;犯困,午休
当前时间:13点,下午状态还不错,继续努力
当前时间:14点,下午状态还不错,继续努力
当前时间:17点,加班哦,疲累至极
当前时间:19点,加班哦,疲累至极
当前时间:22点,不行了,睡着了
--------------------------
当前时间:19点,下班回家了
当前时间:22点,下班回家了

問題があります

オブジェクト指向設計は責任をしたいですか実際にコードの分解です。このクラスは、「単一責任の原則。」従業員の安全のための会社とは、20時00分(現実には多くの場合不可能である、のように考える。)の前に会社を残すために、従業員が必要な場合は、エラーの大きなリスクを維持し、現在のアプローチを変更しますが、これはに反しています「オープンは-原則を閉じました。」

ステート・モード

定義

その動作を変更するために、オブジェクトの内部状態を変更することが許可されている場合、オブジェクトは、そのクラスを変更することが表示されます。

オブジェクト状態遷移の条件式制御があまりにも複雑な状況である場合、メイン溶液状態モードにあります。異なる状態の論理状態を決定することは、複雑な意思決定ロジックを簡素化することができます一連のクラスに転送されます状態の判断は非常にシンプルである場合はもちろん、使用する必要がないことを状態モデル

UMLダイアグラム

コードの実装

状態

/**
 * 抽象状态
 * Created by callmeDevil on 2019/8/3.
 */
public abstract class State {
    public abstract void writeProgram(Work work);
}

ForenoonState

/**
 * 上午工作状态
 * Created by callmeDevil on 2019/8/3.
 */
public class ForenoonState extends State{
    @Override
    public void writeProgram(Work work) {
        if (work.getHour() < 12) {
            System.out.println(String.format("当前时间:%s点,上午工作,精神百倍", work.getHour()));
        } else {
            // 超过12点,转入中午工作状态
            work.setState(new NoonState());
            work.writeProgram();
        }
    }
}

NoonState

/**
 * 中午工作状态
 * Created by callmeDevil on 2019/8/3.
 */
public class NoonState extends State{
    @Override
    public void writeProgram(Work work) {
        if (work.getHour() < 13) {
            System.out.println(String.format("当前时间:%s点,饿了,午饭;犯困,午休", work.getHour()));
        } else {
            // 超过13点,转入下午工作状态
            work.setState(new AfternoonState());
            work.writeProgram();
        }
    }
}

AfternoonState

/**
 * 下午工作状态
 * Created by callmeDevil on 2019/8/3.
 */
public class AfternoonState extends State{
    @Override
    public void writeProgram(Work work) {
        if (work.getHour() < 17) {
            System.out.println(String.format("当前时间:%s点,下午状态还不错,继续努力", work.getHour()));
        } else {
            // 超过17点,转入傍晚工作状态
            work.setState(new EveningState());
            work.writeProgram();
        }
    }
}

EveningState

/**
 * 傍晚工作状态
 * Created by callmeDevil on 2019/8/3.
 */
public class EveningState extends State {
    @Override
    public void writeProgram(Work work) {
        if (work.isTaskFinished()) {
            // 如果完成任务,转入下班状态
            work.setState(new RestState());
        } else {
            if (work.getHour() < 21) {
                System.out.println(String.format("当前时间:%s点,加班哦,疲累至极", work.getHour()));
            } else {
                // 超过21点,转入睡眠工作状态
                work.setState(new SleepingState());
                work.writeProgram();
            }
        }
    }
}

SleepingState

/**
 * 睡眠工作状态
 * Created by callmeDevil on 2019/8/3.
 */
public class SleepingState extends State{
    @Override
    public void writeProgram(Work work) {
        System.out.println(String.format("当前时间:%s点,不行了,睡着了", work.getHour()));
    }
}

休止状態

/**
 * 下班工作状态
 * Created by callmeDevil on 2019/8/3.
 */
public class RestState extends State{
    @Override
    public void writeProgram(Work work) {
        System.out.println(String.format("当前时间:%s点,下班回家了", work.getHour()));
    }
}

作業

/**
 * 工作类,此时没有了过长的分支判断语句
 * Created by callmeDevil on 2019/8/3.
 */
public class Work {

    private State current;
    private int hour; // 时间,状态转换的依据
    private boolean taskFinished; // 任务完成,是否能下班的依据

    public Work(){
        // 工作初始化为上午工作状态,即上午9点开始上班
        current = new ForenoonState();
    }

    public void writeProgram(){
        current.writeProgram(this);
    }

    // 省略 get set 方法

}

上記テストコードとテスト結果。

概要

  • 利点は、ローカライズされた行動の特定の状態に関連し、異なる状態の挙動が分離されます。
  • すべての状態に関連するコードが中にConcreteStateに存在するため、特定の状態は、オブジェクトに動作を関連するので、新たなサブクラス定義は、簡単に新しい状態と遷移を追加することができます。
  • 相互依存性を低減する状態のサブクラスの間の様々な状態遷移ロジックの状態モード分布。
  • オブジェクトの振る舞いは、その状態に依存し、実行時の状態に応じて、その動作を変更しなければならないときは、使用状態モードを考慮することができます。

おすすめ

転載: www.cnblogs.com/call-me-devil/p/11295085.html