2012-02-10 11 views
0

私はデザインパターンにかなり新しいです。開発者がライブラリ(私の場合はHTMLをスクリーンキャプチャするライブラリ)を使用していて、クライアント/呼び出しクラスがそのライブラリに「行き詰まっている」ことを望まない場合の最良のパターンは何ですか?ライブラリ固有のオブジェクトをラップするのに最適なデザインパターン?

例えば、私がHtmlPageというライブラリのクラスを使用していて、クライアントが 'getPage()'と言うと、ライブラリからHtmlPageオブジェクトを返すのではなく、HtmlPageのラッパーもし私が図書館を変更しようと思えば、私は交換することができます。これはこれほど簡単ですか?または私は何かを逃していますか?私は図書館のすべてのオブジェクトに対してこれを行う必要がありますか?

public class HtmlPageWrapper { 
    private HtmlPage htmlPage; 

    public HtmlPageWrapper(HtmlPage) {} 

    public getTableOnPage() { 
     return htmlPage.getTableOnPage; 
    } 

    // etc... 

} 

ありがとう!

答えて

2

あなたはAdapter Patternに興味があると思います。これにより、アプリケーションが使用する抽象的な操作を公開するAdapterクラスを作成することにより、これらのサードパーティのクラスをコードから離しておくことができます。

ライブラリ内のすべてのオブジェクトに対して必ずしもこれを行う必要はありません。対話する必要のあるメインオブジェクトをラップするようにしてください。

+0

おかげで、多分私はちょうどそれをoverthinkingよ...私はそれが使用する1つかもしれないと思ったが、私はそれだけで一緒に互換性のないクラスをブリッジするためだと思いました。 – acvcu

+0

これはもっとも一般的な使用例ですが、将来的に別のhtmlスクリーンスクレイピングライブラリを導入するとシナリオで使用することもできます。そのライブラリのインターフェイスは現在のライブラリと互換性がなく、コードと互換性がない可能性があります。 – ggreiner

0

私はちょうどあなたが非表示にする場合にもFacadeパターンを試すことができ

public class HtmlPageWrapper extends HtmlPage { 

    public HtmlPageWrapper(HtmlPage p) { 
     super(p); 
    } 

    @Override 
    public getTableOnPage() { 
     return super.getTableOnPage(); 
    } 

    // etc... 

} 
0

、その後、私はまだ好きなものを再利用することができ、それを拡張し、私が追加/変更したいものをオーバーライドします1つのインタフェースの後ろにあるライブラリであり、異なるライブラリの実装が異なる場合があります。

サブシステム内のインターフェイスセットへの統合インターフェイスを提供します。 Façadeは、サブシステムを使いやすくする高水準のインタフェースを定義しています。

参考:Façade Pattern

関連する問題