14

Command パターンについてはよく知っていますが、Functor と Command の理論上の違いはまだわかりません。特にJavaの実装を考えています。どちらも基本的に、オブジェクトとして表される「動詞」をプログラミングしています。ただし、ファンクタの場合、いくつかの例からわかるように、匿名の内部クラスの実装が一般的です。誰かが私のためにこれをきれいに片付けることができますか?

4

7 に答える 7

18

ファンクターは実装であり、オブジェクトを関数のように動作させる方法です。

「コマンドパターン」はデザインパターンです。
ファンクターは、「コマンド パターン」を実装する 1 つの方法です。

于 2008-11-03T11:52:36.620 に答える
8

これがGOFからの答えです:

Coplienは、C ++[Cop92]でファンクター(関数であるオブジェクト)を実装する方法について説明しています。彼は、関数呼び出し演算子(operator())をオーバーロードすることにより、それらの使用においてある程度の透明性を実現しています。コマンドパターンは異なります。その焦点は、関数を維持するだけでなく、レシーバーと関数(つまり、アクション)の間の バインディングを維持することにあります。

于 2009-01-16T19:23:33.193 に答える
8

ファンクターは「構文レベル」の概念です。つまり、関数ポインターのように構文的に処理できるオブジェクトにコードをパッケージ化します。つまり、その後にパラメーター リストを括弧で囲んで「呼び出す」ことができます。C++ では、operator() をオーバーライドすることで、クラスをファンクターにすることができます。

コマンド パターンの Command は、実行可能な機能をパッケージ化したオブジェクトですが、ファンクタである必要はありません。たとえば、インターフェイス ICommand を実装するクラスであり、Do() を呼び出してそのコマンドを実行できるようにすることができます。

于 2008-11-03T12:44:59.383 に答える
5

Apache Commons Functorページの説明から:


ファンクターは、オブジェクトとして操作できる関数、または単一の汎用関数を表すオブジェクトです。

ファンクターは、次のような多くの強力なプログラミング手法をサポートおよび奨励します。

  • 関数型のプログラミング
  • 高階関数
  • 内部反復子
  • 継承やオーバーロードではなく、合成による再利用と特殊化
  • 一般的な「コールバック」または「拡張ポイント」API
  • 一般的な「フィルター」または述語 API
  • 訪問者、戦略、責任の連鎖など、多くの「行動」設計パターン。
于 2008-11-03T11:43:10.040 に答える
4

GOF (Gang of Four) の引用された定義 (Comptrol による) によると、Functor と Command は 2 つの異なるパターンです。

すでに述べたように、Functor はサービス メソッドを含むクラスを表します。つまり、Functor クラスの主な役割は、独自のメソッドに実装された特定のロジックを格納することです。したがって、ファンクターで、独自のメソッドの内部ロジックのコンテナーをどのように考えることができます。歴史的に、Functor が生まれたのは、Java 仕様に「関数ポインター」の実装や概念が存在しないためです。これは、登録されたコールバック (オブザーバー パターンの特定の実装) のコンテキストで非常に役立ちます。

コマンド パターンは、Invoker エンティティを Receiver エンティティから分離することを目的とした設計パターンを表します。これは主に、アクション リスナーからアクション (イベントの生成) を分離する必要がある場合に使用されます (GUI と考えてください)。これには、特定のオブジェクト レシーバーを参照する特定の操作 (独自のスーパークラスからの特定のコマンドの実装に応じて) の実行を担当するメソッドがあります。前述の定義では、実行メソッドは「スマートではない」と定義できます。実際、スマートな実装では、それを 3 番目のオブジェクトに委譲するのではなく、それ自体が操作ロジックを実装することができます。スマート実行メソッドがある場合、ファンクターを実装しており、ファンクター (特定のコマンド サブパーツの実装) をコマンド パターンのコンテキストに配置しています。

これがお役に立てば幸いです。

于 2011-05-17T10:45:45.440 に答える
3

Java にはクロージャがないため、Java では Command パターンが使用されます。ファンクターは、クロージャーを実装する試みです。

クロージャのある言語には Command パターンは必要ありません。

于 2008-11-03T13:12:56.537 に答える
3

私は、ファンクターをコマンド パターンのコンポーネントと考えています。コマンド パターンには、インボーカーやコマンドの受信者などの他のインフラストラクチャも含まれます。

于 2008-11-03T12:08:59.707 に答える