Java Strategy Pattern(ポリシーモード)

2286 ワード

ポリシー・モード(Strategy Pattern)では、クラスの動作またはそのアルゴリズムを実行時に変更できます.このタイプの設計モードは、動作モードに属します.ポリシー・モードでは、ポリシー・オブジェクトの変更に伴って様々なポリシーを表すオブジェクトと、ポリシー・オブジェクトの変更に伴って動作が変化するcontextオブジェクトを作成します.ポリシー・オブジェクトはcontextオブジェクトの実行アルゴリズムを変更します.
キーコード:同じインタフェースを実装します.
利点:1、アルゴリズムは自由に切り替えることができます.2、多重条件判断を避ける.3、拡張性が良い.短所:1、戦略類が増える.2、すべての戦略類は対外暴露が必要である.
注意:1つのシステムのポリシーが4つ以上ある場合は、ハイブリッドモードを使用して、ポリシークラスの膨張の問題を解決することを考慮する必要があります.
  • インタフェースを作成します.
  • /**
     * 1.       
     * @author mazaiting
     */
    public interface Strategy {
        /**
         *   
         */
        int doOperation(int num1, int num2);
    }
    
  • は、実装インタフェースのエンティティクラスを作成する.
  • /**
     * 2.           。
     * @author mazaiting
     */
    public class OperationAdd implements Strategy{
    
        public int doOperation(int num1, int num2) {
            return num1 + num2;
        }
    
    }
    
    
    /**
     * 2.           。
     * @author mazaiting
     */
    public class OperationSub implements Strategy{
    
        public int doOperation(int num1, int num2) {
            return num1 - num2;
        }
    
    }
    
    /**
     * 2.           。
     * @author mazaiting
     */
    public class OperationMult implements Strategy{
    
        public int doOperation(int num1, int num2) {
            return num1 * num2;
        }
    
    }
    
  • Contextクラスを作成します.
  • /**
     * 3.    Context  。
     * @author mazaiting
     */
    public class Context {
        private Strategy strategy;
        
        public Context(Strategy strategy) {
            this.strategy = strategy;
        }
        
        public int executeStrategy(int num1, int num2) {
            return strategy.doOperation(num1, num2);
        }   
    }
    
  • Contextを使用して、ポリシーStrategyを変更したときの動作の変化を表示します.
  • /**
     * 4.    Context           Strategy       。
     * @author mazaiting
     */
    public class Client {
    
        public static void main(String[] args) {
            Context context = new Context(new OperationAdd());
            System.out.println("10 + 5 = " + context.executeStrategy(10, 5));
    
            context = new Context(new OperationSub());
            System.out.println("10 - 5 = " + context.executeStrategy(10, 5));
    
            context = new Context(new OperationMult());
            System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
        }
    }
    
  • 印刷結果
  • 10 + 5 = 15
    10 - 5 = 5
    10 * 5 = 50