Strategyパターンは、処理の戦略(アルゴリズム)をクラスとして取り出し、取り替え可能にするパターンです。
using System; namespace Strategy { //---------------------------------------------------------------- // デザインパターン Strategy // // // アルゴリズムの集合を定義し、それぞれのアルゴリズムをカプセル化して // それらを交換可能にする。Strategyパターンはアルゴリズムを、 // それを利用するクライアントから独立に変更できるようにする // //---------------------------------------------------------------- //戦略の抽象定義 public abstract class Strategy { //戦略メソッドの抽象定義 public abstract void AlgorithmInterface(); } //具象化クラス(プレゼント戦略) public class ConcreteStrategy_Presents :Strategy { //ここには実際に行う処理を記述します public override void AlgorithmInterface() { Console.WriteLine("バラの花を贈ります。"); } } //具象化クラス(ソング戦略) public class ConcreteStrategy_Songs :Strategy { //ここには実際に行う処理を記述します public override void AlgorithmInterface() { Console.WriteLine("シャンソン愛の賛歌を歌います。"); } } //具象化クラス(コンビニエンス戦略) public class ConcreteStrategy_Convenience :Strategy { //ここには実際に行う処理を記述します public override void AlgorithmInterface() { Console.WriteLine("女王様!!僕は何でも言うことをききます。"); } } public class Context { private Strategy strategy; public Strategy SetStrategy { set{this.strategy=value;} } public void ContextInterface() { //具象化されるメソッドがオーバーライドされるって仕組みだね strategy.AlgorithmInterface(); } } /// <summary> /// Class1 の概要の説明です。 /// </summary> class Class1 { /// <summary> /// アプリケーションのメイン エントリ ポイントです。 /// </summary> [STAThread] static void Main(string[] args) { //ポイント&解説、戦略を切り替えて、利用したい状況を考える //道端で女の子に声をかけるシュミレーションを例に取りましょう //実行するのはContextインスタンスです。 //Contextインスタンスはいろんな振る舞いを装うことが予想されますが、 //Contextインスタンスが実行できるContextInterface()メソッドただ一つです。 //お嬢様タイプを見つけた場合(プレゼント戦略が可能) Context Ctx =new Context(); Ctx.SetStrategy =new ConcreteStrategy_Presents(); //実行 Ctx.ContextInterface(); //戦略リセット Ctx.SetStrategy=null; //のりのりタイプを見つけた場合(カラオケ戦略が可能) Ctx.SetStrategy =new ConcreteStrategy_Songs(); //実行 Ctx.ContextInterface(); //戦略リセット Ctx.SetStrategy=null; //女王様タイプを見つけた場合(下僕戦略として) Ctx =new Context(); Ctx.SetStrategy =new ConcreteStrategy_Convenience(); //実行 Ctx.ContextInterface(); //------------------------------------------------------- // あとがき // Ctxは一人で幾つもの演出を切り替えて実行することが出来ました。 // このように、具象化するアルゴリズムをカプセル化して // クライアントはクライアントから独立に変更できるようにできます。 //------------------------------------------------------- } } }
1: package strategy; 2: 3: public class Context { 4: 5: private Strategy strategy; 6: 7: public Strategy getStrategy() { 8: return strategy; 9: } 10: 11: public void setStrategy(Strategy strategy) { 12: this.strategy = strategy; 13: } 14: 15: public void ContextInterface() { 16: this.getStrategy().algorithmInterface(); 17: } 18: 19: }
1: package strategy; 2: 3: public abstract class Strategy { 4: 5: public abstract void algorithmInterface(); 6: 7: }
1: package strategy; 2: 3: public class ConcreteStrategy_Presents extends Strategy { 4: 5: public void algorithmInterface() { 6: System.out.println("バラの花を贈ります。"); 7: } 8: }
1: package strategy; 2: 3: public class ConcreteStrategy_Songs extends Strategy { 4: 5: public void algorithmInterface() { 6: System.out.println("シャンソン愛の賛歌を歌います。"); 7: } 8: }
1: package strategy; 2: 3: public class ConcreteStrategy_Convenience extends Strategy { 4: 5: public void algorithmInterface() { 6: System.out.println("女王様!!僕は何でも言うこと聞きます。"); 7: } 8: 9: }
1: package strategy; 2: 3: public class StartClass { 4: 5: public static void main(String[] args) { 6: //戦略です。 7: Context ctx =new Context(); 8: //Strategy:Presents戦略 9: ctx.setStrategy(new ConcreteStrategy_Presents()); 10: ctx.ContextInterface(); 11: ctx.setStrategy(null); 12: //Strategy:Songs戦略 13: ctx.setStrategy(new ConcreteStrategy_Songs()); 14: ctx.ContextInterface(); 15: ctx.setStrategy(null); 16: //Strategy:Convenience戦略 17: ctx.setStrategy(new ConcreteStrategy_Convenience()); 18: ctx.ContextInterface(); 19: ctx.setStrategy(null); 20: } 21: }
デザインパターン「ひとくちメモ」へ
Homeへもどる