簡単な解決策は、@Andrew Marshallのソリューションと同様に、戦略のタイプと戦略クラスのマッピングを作成することです
しかし、より良いものにするために、次の2つのことを検討します。
FooxBox
ストラテジーのホルダー (ここでは これは柔軟なアプローチではありません。ある日、別の戦略を追加したい場合は、コードに移動して追加しますか? ruby を使用すると、「自己登録」で簡単に実行できます。
- 戦略ホルダーが乱暴に実装を返すことは望ましくありません。つまり、「BoxA」と「BoxB」の両方、またはいつか「BoxXYZ」の両方が同じ戦略概念に属している必要があります。Java では、おそらくそれらすべてが を実装する必要があることを意味します
interface
。私たちは一般的にそれを行いますinclude SomeMoudle
私のアプリケーションでは、次のソリューションを使用しています(デモのみ)
module Strategies
def self.strategies
@@strategies ||= {}
end
def self.strategy_for(strategy_name)
@@strategies[strategy_name]
end
end
module Strategy
def self.included(base)
base.class_eval do
def self.strategy_as(strategy_name)
Strategies.strategies[strategy_name] = self
end
end
end
end
class BoxA
include Strategy
strategy_as :box_a
def do_stuff
puts "do stuff in BoxA"
end
end
class BoxB
include Strategy
strategy_as :box_b
def do_stuff
p "do stuff in BoxB"
end
end
## test
Strategies.strategy_for(:box_a).new.do_stuff
Strategies.strategy_for(:box_b).new.do_stuff
マッチブロックで戦略を検出したい場合はstrategy_as
、ブロックを受け入れるように変更できます。次に使用するStrategies.strategy_for{...}.new.do_stuff