モーダルを閉じる工作HardwareHub ロゴ画像

工作HardwareHubは、ロボット工作や電子工作に関する情報やモノが行き交うコミュニティサイトです。さらに詳しく

利用規約、プライバシーポリシー に同意したうえでログインしてください。

工作HardwareHub ロゴ画像 (Laptop端末利用時)
工作HardwareHub ロゴ画像 (Mobile端末利用時)

Java Strategy デザインパターン

モーダルを閉じる

ステッカーを選択してください

モーダルを閉じる

お支払い内容をご確認ください

購入商品
「」ステッカーの表示権
メッセージ
料金
¥(税込)
決済方法
GooglePayマーク
決済プラットフォーム
確認事項

※利用規約をご確認のうえお支払いください

※カード情報はGoogleアカウント内に保存されます。本サイトやStripeには保存されません

※記事の執筆者は購入者のユーザー名を知ることができます

※購入後のキャンセルはできません

公開日公開日
2013/08/13
最終更新最終更新
2015/12/17
記事区分記事区分
一般公開

目次

    アカウント プロフィール画像 (サイドバー)

    Javaちょっとできるプログラマ。教育業界のエンジニアです。

    0
    ステッカーを贈るとは?

    一般にある問題を解くためのアルゴリズムは複数存在します。このアルゴリズム (Strategy) 部分をinterfaceで要請した形式に合わせて実装し、委譲を用いて分離することで状況に応じて切り替えて使用できるようにします。切り替え可能なアルゴリズム以外の部分は、委譲でアルゴリズムを利用する側に実装します。また、Mainから直接Strategyを利用することは避けましょう。

    サンプルコード

    ある範囲に存在する素数を以下の二つのアルゴリズムで列挙します:

    • それぞれの値を一つ一つ見ていき、それが素数かどうか判断する
    • エラトステネスの篩 (Sieve of Eratosthenes)

    sample.java

    class Sample {
        public static void main(String args[]) {
            int rangeTo = 100;
            PrimeGenerator eachGen = new PrimeGenerator(new EachStrategy(rangeTo));
            PrimeGenerator sieveGen = new PrimeGenerator(new SieveStrategy(rangeTo));
    
            while(eachGen.hasNext()) System.out.print(eachGen.next() + " ");
            System.out.println("");
            while(sieveGen.hasNext()) System.out.print(sieveGen.next() + " ");
            System.out.println("");
        }
    }
    

    PrimeGenerator.java

    class PrimeGenerator {
        private Strategy strategy;
        public PrimeGenerator(Strategy strategy) {this.strategy = strategy;}
        public int next() {return strategy.next();}
        public boolean hasNext() {return strategy.hasNext();}
    }
    

    Strategy.java

    interface Strategy {
        public abstract int next();
        public abstract boolean hasNext();
    }
    

    EachStrategy.java

    class EachStrategy implements Strategy {
        private int max;
        private int nextPrime;
        public EachStrategy(int max) {
            this.max=max;
            nextPrime=2;
        }
        public int next() {return nextPrime++;}
        public boolean hasNext() {
            do {
                boolean isPrime=true;
                for(int i=2; i*i<=nextPrime; ++i) {
                    if(nextPrime%i==0) {isPrime=false; break;}
                }
                if(isPrime) return true;
            } while(++nextPrime <= max);
            return false;
        }
    }
    

    SieveStrategy.java

    class SieveStrategy implements Strategy {
        private boolean isPrime[];
        private int nextPrime;
        public SieveStrategy(int max) {
            this.isPrime = new boolean[max+1];
            isPrime[0]=isPrime[1]=false;
            for(int i=2; i<isPrime.length; ++i) isPrime[i]=true;
            nextPrime=2;
        }
        public int next() {return nextPrime++;}
        public boolean hasNext() {
            while(nextPrime<isPrime.length && !isPrime[nextPrime]) ++nextPrime;
            for(int i=nextPrime*2; i<isPrime.length; i+=nextPrime) isPrime[i]=false;
            return (nextPrime<isPrime.length) ? true : false;
        }
    }
    

    実行例

    $ javac EachStrategy.java  PrimeGenerator.java  SieveStrategy.java  Strategy.java  sample.java && java Sample
    2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 
    2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 
    
    0
    詳細設定を開く/閉じる
    アカウント プロフィール画像 (本文下)

    Javaちょっとできるプログラマ。教育業界のエンジニアです。

    記事の執筆者にステッカーを贈る

    有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。

    さらに詳しく →
    ステッカーを贈る コンセプト画像

    Feedbacks

    Feedbacks コンセプト画像

      ログインするとコメントを投稿できます。

      関連記事

      • Spring Security フォームログインのサンプルコード
        Spring フレームワークによる Web アプリケーション開発で、ログイン処理を実装する際は Spring Security が便利です。ここでは特に Spring Boot で Web アプリケーションを開発する場合を対象とし、フォームによる ID/Password ログインを行うためのサンプルコードをまとめます。 公式ドキュメント [Spring Security チュートリアル](http...
        えびちゃんえびちゃん12/4/2019に更新
        いいねアイコン画像0
      • Java配列の宣言方法 (C/C++との違い)
        Javaの配列 Javaの配列宣言方法はC/C++と似ているようで若干異なる。 初期化しない場合 C/C++の int array[10]; はJavaでは int array[] = new int[10]; となる。同様にC/C++の int array[3][3]; はJavaでは int array[][] = new int[3][3]; となる。 初期化
        てんとうむしてんとうむし5/13/2018に更新
        いいねアイコン画像0
      • PlantUML による UML 図の描き方
        サムネイル画像-c788fffde5
        PlantUML はテキスト形式で表現されたシーケンス図やクラス図といった UML (Unified Modeling Language) 図の情報から画像を生成するためのツールです。簡単な使い方をまとめます。 インストール方法の選択 Atom や Eclipse のプラグインをインストールしてエディタから利用する方法、JAR をダウンロードして Java コマンドで実行する方法、Redmine ...
        kentakenta1/21/2020に更新
        いいねアイコン画像0
      • Akka HTTP サンプルコード (Scala)
        サムネイル画像-a98142497c
        Akka アクターを用いて実装された汎用 HTTP フレームワークです。Spray の後継です。コアモジュールである akka-http-core は 2016/2/17 に experimental が外れました。akka-http などのいくつかのサブモジュールは 2016/3/1 現在 experimental のままですが、基本的な
        雄太雄太10/7/2021に更新
        いいねアイコン画像0
      • Kestrel の使用例
        Kestrel は Message Queue (MQ) の実装のひとつです。一般に MQ はアプリケーション間やプロセス間、スレッド間で非同期に通信するために用いられます。メッセージの送信側は MQ に書き込めば受信側の応答を待たずに次の処理に非同期に進むことができます。Kestrel はわずか 2500 行程の Scala で実装されており JVM で動作します。MQ 自体はメモリ上に存在する...
        したくんしたくん10/12/2017に更新
        いいねアイコン画像0