2009-04-14 12 views
5

私たちのコードベースのすべてでは、1つのメソッドとのインターフェイスがあるこの繰り返しパターンがあります。これは本当のデザインパターンですか?もしそうなら、それは何であり、利益は何ですか?ここでこれはデザインパターンですか?

は、いくつかの例です:

public interface IRunnable 
    {  
     void Run();  
    } 

    public interface IAction 
    { 
     void Perform(); 
    } 

    public interface ICommand 
    { 
     void Execute(ActionArgs _actionargs); 
    } 

答えて

5

私は、これはCommand patternとして参照さ見てきました。

初めて私はBobさんのおじさんのAgile Principles, Patterns, and Practices in C#を読むことを学びました。

私はその優雅さがそのシンプルさだと信じています。私はファイル処理サービスを書いたときに使ってきました。このサービスは、ファイルの読み取り/削除の管理をすべて実行しました。ファイルを処理する必要があるときは、それぞれのプラグインがロードされています。各プラグインはProcessメソッドを実装し、そのタイプのファイルを処理するために必要な処理を行いました。 (主に内容を解析してデータベースに挿入する)

新しいレイアウトで新しいファイルタイプを処理するたびに、Processを実装した新しいプラグインを作成するだけでした。

私は単純な解決策が必要だったので、これは私のために働いていました。複数のパラメータを取り込む必要がある場合、これはおそらく使用するパターンではありません。

2

これらのいずれも、使用方法やコンテキストによっては、Command Patternの特定のケースになる可能性があります。これの一部は、これを設定する理由と方法に依存します。

コマンドパターンには、通常、状態とさまざまなオブジェクトの概念も含まれます。典型的には、このタイプのインターフェースは、私はあなたがここでデザインパターンとして考えているものだと推測していますが、呼び出し元や複数のターゲットがなければ、これが古典的な例であるかどうかを判断することは困難です。 ..

しかし、これは、基本的なインターフェイスの抽象化であり、デザインパターンとして分類するものではありません。

1

あなたが提供したインターフェイスは一般的に経験のある問題の解決策ではなく、開発しているプロジェクトの非常に具体的な問題の解決策を提供するため、設計パターンと呼ぶことができるかどうかはわかりません。

インターフェイスを適切に使用している理由は、これらのメソッドが必要なすべてのクラスを含むことができないためです。前のポスターの一部が提案したよう

は、次のようになります。あなたはラムダ式を使って、この繰り返しを削除(または将来のコードのためにそれを防ぐ)ことができますhttp://en.wikipedia.org/wiki/Command_pattern

1

。ラムダ式はまさにこのような状況に適しています。

1

何かあれば、それはファンクタです。スレッドのmain関数など、関数(ポインタ)が使用されているようなもののためにファーストクラスの関数(ポインタ)のない言語で使用されています。

1

インターフェイスには1つのメソッドしかないアプリケーションがあります。つまり、.NETでは、INotifyPropertyChanged(PropertyChangedイベント)がたくさんあります。オブジェクトが特定のメソッドを持っていることを保証します(実際にオブジェクトのタイプに関係なく)ので、呼び出すことができます(タイプに関係なく)。

Dim runnableObjects As List(Of Object) 
runnableObjects.Add(New MyRunnableObject1) 
runnableObjects.Add(New MyRunnableObject2) 

For Each o As IRunnable In runnableObjects 
    o.Run() 
Next 
2

これは、Command Design Patternと言われていました。しかし、結果を達成するJavaの方法に似ています(私にとって)。 C#では、デリゲートとC++の関数ポインタと関数を使用することができます。

何らかのクラスメソッドで反応の実装が既にある場合は、より多くのクラスを作成することは大きな意味がありません。あなたはC++でバインドしたり、C#で委譲することができます。 Javaでは、あなたが見つけたコードを書く以外に選択肢はないと思います。

0

多分私は何かが欠けているかもしれませんが、最初の2つはstrategy patternの一部であるように見えます。基本的には、オブジェクトにはIAction型のメンバーがあり、特定の方法でタスクを実行する(つまり特定の戦略を使用する)ために、システムのニーズに基づいて実行時にそのメンバーが割り当て/再割り当てされます。

関連する問題