ロゴ
ホーム 提案事例 Obxetoについて 問い合わせ

1. Strategy Pattern

1.1 特徴

Strategy Patternは、アルゴリズムを実行時に動的に選択可能にするDesign Patternです。

1.2 サンプルプログラムを書いた目的

直感的にアルゴリズムが選択可能であることが分かりやすいサンプル・プログラムを目標にコードを記述しました。 また、Objective-Cのサンプルも少ないようであったので、コードはObjective-Cで記述しました。

1.3 選択可能なアルゴリズム

肥満度指数を求めるアルゴリズム、1)BMI指数と2)ローレル指数の ふたつをConcreateクラスとして定義し、それを実行時にContextクラスに設定している。

  • BMIStrategyクラス:BMI指数を求めるアルゴリズム
  • RohrerStrategyクラス:ローレル指数を求めるアルゴリズム

サンプルでは、実行時に選択(設定)されたアルゴリズムに対応した各々の指数を表示します。

1.4 サンプルプログラム

        #import <Foundation/Foundation.h>
        
        /* Strategyクラスに実装されるべきメソッドを定義 */
        @protocol Strategy<NSObject>
        - (void)calculateWithHeight:(NSInteger)height weight:(NSInteger)weight;
        @end
        
        /* Concreateクラス:BMI指数算出アルゴリズム */
        @interface BMIStrategy : NSObject<Strategy>
        @end
        @implementation BMIStrategy
        - (void)calculateWithHeight:(NSInteger)height weight:(NSInteger)weight;
        {
            // BMI = 体重(kg) ÷ (身長(cm) * 身長(cm)) x 10000
            NSInteger bmi = (weight * 10000) / (height * height);
            NSLog(@"BMI Index:%ld ", bmi);
        }
        @end

        /* Concreateクラス:Rohrer(ローレル)指数算出アルゴリズム */
        @interface RohrerStrategy : NSObject<Strategy>
        @end
        @implementation RohrerStrategy
        - (void)calculateWithHeight:(NSInteger)height weight:(NSInteger)weight;
        {
            // ローレル指数=体重(kg)÷(身長(cm) * 身長(cm) * 身長(cm)) ×10000000
            NSInteger rohrer = weight * (10000000 / (height * height * height));
            NSLog(@"Rohrer Index:%ld ", rohrer);
        }
        @end
        
        /* Contextクラス:肥満度を表示する */
        @interface Context : NSObject
        id<Strategy>_strategy;

        - (id)initWithStrategy:(id<Strategy>)strategy;
        - (void)executeWithHeight:(NSInteger)height weight:(NSInteger)weight;
        @end
        @implementation Context
        - (id)initWithStrategy:(id<Strategy>)strategy
        {
            if (self = [super init]) {
                _strategy = strategy;
            }
            return self;
        }
        - (void)executeWithHeight:(NSInteger)height weight:(NSInteger)weight;
        {
            [_strategy calculateWithHeight:height weight:weight];
        }
        @end

        int main(int argc, const char * argv[])
        {
            id<Strategy> strategy;
            Context *context;
            
            strategy = [BMIStrategy new];
            context  = [[Context alloc] initWithStrategy:strategy];
            [context executeWithHeight:175 weight:68];

            strategy = [RohrerStrategy new];
            context  = [[Context alloc] initWithStrategy:strategy];
            [context executeWithHeight:175 weight:68];
            
            return 0;
        }
     

参考文献: Deign Pattern by Erich Gamma, Richard Helm, Ralph Johnson and John Vlissides