-1

私は戦略的なデザインパターンを実装しようとしています。if-elseラダーを無視して戦略的なデザインパターンを実装する

は私が持っているシンプルなのif-else以下のようにはしご:

 if(dataKeyinresponse === 'year') { 
      bsd = new Date(moment(new Date(item['key'])).startOf('year').format('YYYY-MM-DD')) 
      nestedbed = new Date(moment(new Date(item['key'])).endOf('year').format('YYYY-MM-DD')); 
     } else if(dataKeyinresponse === 'quarter') { 
      let tempDate = new Date(moment(new Date(item['key'])).add(2, 'months').format('YYYY-MM-DD')); 
      // nestedbed = new Date(moment(new Date(item['key'])).add(3, 'months').format('YYYY-MM-DD')); 
      nestedbed = new Date(moment(tempDate).endOf('month').format('YYYY-MM-DD')); 
     } else if(dataKeyinresponse === 'month') { 
      nestedbed = new Date(moment(new Date(item['key'])).endOf('month').format('YYYY-MM-DD')); 
     } else if(dataKeyinresponse === 'week') { 
      //Relying more on the ES start date for week 
      nestedbed = new Date(moment(new Date(item['key'])).weekday(7).format('YYYY-MM-DD')); 

     } else { 
      // bed = bucketStartDate; 
      nestedbed = new Date(item['key']); 
     } 

と私はそれに戦略的なパターンを実装:私は条件に基づいて特定のクラスを呼び出す方法として混乱しています

interface emptyBucketInterface { 
    fnGetEmptyBuckets(); 
} 
class year implements emptyBucketInterface { 
    fnGetEmptyBuckets() { 
     bsd = new Date(moment(new Date(item['key'])).startOf('year').format('YYYY-MM-DD')) 
     nestedbed = new Date(moment(new Date(item['key'])).endOf('year').format('YYYY-MM-DD')); 
     return { 
      "bsd": bsd, 
      "nestedbed": nestedbed 
     }; 
    } 
} 
class quarter implements emptyBucketInterface { 
    fnGetEmptyBuckets() { 
     let tempDate = new Date(moment(new Date(item['key'])).add(2, 'months').format('YYYY-MM-DD')); 
     nestedbed = new Date(moment(tempDate).endOf('month').format('YYYY-MM-DD')); 
     return { 
      "tempDate": tempDate, 
      "nestedbed": nestedbed 
     }; 
    } 
} 
class month implements emptyBucketInterface { 
    fnGetEmptyBuckets() { 
     nestedbed = new Date(moment(new Date(item['key'])).endOf('month').format('YYYY-MM-DD')); 
     return { 
      "nestedbed": nestedbed 
     }; 
    } 
} 
class week implements emptyBucketInterface { 
    fnGetEmptyBuckets() { 
     nestedbed = new Date(moment(new Date(item['key'])).weekday(7).format('YYYY-MM-DD')); 
     return { 
      "nestedbed": nestedbed 
     }; 
    } 
} 

が、

if-elseラダーと同様に、dataKeyinresponseの値を確認してから、いくつかのステートメントを実行します。

しかし、ここで戦略パターンでどのように条件を見て、そのクラスを実行します。

助けていただければ幸いです。

+0

であなたのクラスに名前を付ける必要がありますが、あなたが返すオブジェクトは、あなたのIF-に関してanytting作成されますが、実際には変更されていない方法を変更しているように思えますそれ以外ははしご。 switch文、または '年'、 '四半期'、 '月'という名前の関数を持つオブジェクトのほうがよいかもしれません.... – user3094755

+0

... 'actions [datakeyinresponse]()'? – jdphenix

+0

@Scary Wombat そのコードはタイスクリプトで書かれています –

答えて

1

戦略パターンの簡単な例:工場での戦略の作成をカプセル化するhttps://www.tomasmalmsten.com/2011/01/create-factory-strategies-ifs/

public class SomeClass { 
    private final Map<String, EmptyBucketInterface> strategies = new HashMap<String, EmptyBucketInterface>(); 

    public SomeClass() { 
     strategies.put("year", new Year()); 
     strategies.put("quarter", new Quarter()); 
     strategies.put("month", new Month()); 
     strategies.put("week", new Week()); 
    } 

    public void doAction(String action) { 
     strategies.get(action).fnGetEmptyBuckets(); 
    } 
} 

あなたはこのを見てみることがあります。

アドバイス:あなたは大文字の最初の文字emptyBucketInterface =>EmptyBucketInterface

関連する問題