2011-09-19 5 views
6

hereによってMauricio Linharesに興味をそそるアプローチを見ました。クロージャを通してオブジェクトに対するアクションが起こるアプローチのデザインパターン/用途

このDataObjectのに直接ロックを追加し、あなたが のように、このことを定義することができます。

public class DataObject { 
    private Lock lock = new ReentrantLock(); 

    public void lock() { this.lock.lock(); } 
    public void unlock() { this.lock.unlock(); } 
    public void doWithAction(DataObjectAction action) { 
    this.lock(); 
    try { 
     action.doWithLock(this) : 
    } finally { 
     this.unlock(); 
    } 
    } 

    // other methods here 

} 

public interface DataObjectAction { void doWithLock(DataObject object); } 

をし、それを使用しているとき、あなたはこのようにそれを単に行うことができます:

DataObject object = // something here 
object.doWithAction(new DataObjectAction() { 

    public void doWithLock(DataObject object) { 
    object.setProperty("Setting the value inside a locked object"); 
    } 

}); 

私はこのような解決策を考えていないでしょう。オブジェクトに対するアクションは、それ自身のインスタンス(this)を渡すクロージャによって処理されます。

これは特定のデザインパターンに従っていますか?

その他の一般的な用途はありますか?私はガードロックを思いつき、EDTを扱い、リソースがtry/finallyで閉じられるようにすることができます。

このようなアプローチの新しい用途はわかります。私はそれをツールボックスに追加することができます。

+0

匿名のmehtodが外部変数を保持していないため、閉鎖が表示されない – sll

+0

という用語をjava-idiomaticで使用しています。 http://en.wikipedia.org/wiki/Closure_%28computer_science%29#Anonymous_inner-classes_.28Java.29匿名のクラス、コールバック、またはその他のものを呼び出したい場合は、回答を提出してください。パターンとそこで使用される用語を定義します。私は別の使用法が指定された具象実装を使用できない、ローカル状態を持っている、またはクラスを含んでいる状態を変更することができない理由は見当たりません。このパターン/アプローチ(質問の目標)のより多くの例を持つことは、私たちの両方がそれをどのように適用できるかを理解するのに役立つかもしれません。 – Dan

+0

私の答えに対する回答はありますか?コメント?投票?同意する? –

答えて

2

それは、は(patterns repositorythis SO questionを参照してください)メソッドイディオムの周りを実行しています。これは、戦略パターンと非常に関連しています。この特定の例はまた、低レベルのDouble Dispatchパターンを利用する。

OOPパターンとして最初に記述された時期はわかりませんが、Smalltalkベストプラクティスパターン KentBeckによると思われます。その前にLISPで使用されていたかもしれませんが、私は頭の上からそれを証明していません。

Executed Around Methodは抽象度が約try ... catch ... finallyであり、コードブロックの後に実行する必要がある場合に使用されます。リソースを管理することは、典型的な例です:あなたの第二のように、あなたは通常閉鎖で使用するイディオムを見つけコミットまたはロールバック取引ロックとミューテックスを解放し、ファイル、ソケットなどを閉じ、

例。 SmalltalkとRubyは、このイディオムを使用する星です。どこでも見ることができます。

いくつかの言語では、このパターンの周りに砂糖構文で構築が開始されています。 Pythonには "context managers"があります。 C#にはusing statementがあります。 Java 7はtry with resourceです。デストラクタ(C++/D)を持つ言語では、関連するイディオムはResource Acquisition Is Initilazation (RAII)です。 Dはまたを有し、これはtry ... catch ... finallyの別の抽象である。


更新

だけのリソース管理に加えて、あなたが呼び出しの周りまたは反復中に共通のことを行う必要があるとき、それは便利です。

春-JDBCは、クエリを通じて抽象反復にそれを使用しています。RowMapperの、RowCallbackHandler、およびResultSetExtractor

を参照してくださいJDKはあなたがストップウォッチの実装でそれを使用することができますprivileged actions

を実行するためにパターンを使用しています。

私はそれが登録可能なフックで、コードブロックの周りに無関係なことをするのに使われているのを見てきました。そのようなもの:データベースへの状態書き込み、結果のログ、実行時間のログ、および後続のアクションのスケジュール。

+0

もう1つの例として、このパターンを抽象的なリトライロジックに使用しました。 –

0

これは閉鎖ではない匿名クラス