2016-09-16 7 views
3

デコレータが互換性のないコンポーネントに適用されている場合はどうしますか?デコレータパターン - 特定のタイプのコンポーネントにデコレータを限定する

パターンの使用方法を説明するために与えられた古典的な例を考えてみると、グラフィカルウィンドウは、スクロールバーデコレータをダイアログに適用するとどうなりますか(「ダイアログ」は固定サイズの具体的なウィンドウコンポーネント)?そうではなく、何が起こるべきか? (少なくとも、スクロールバーで装飾されたダイアログのユーザーが画面上で見ているものに関しては、少なくとも「何も」起こらないと思っていますが、私は人々がばかなことをするのを避ける戦略にもっと興味があります)

答えて

3

が、私はあなたがmarkerインタフェースパターンを使用することによって、これを達成することができます愚かな

をしている人々を避けるための戦略でより興味があります。

  • Scrollableというインターフェイスを定義します。
  • スクロール機能をサポートするすべてのコンポーネントがこのインターフェイスを実装します。たとえば、WindowScrollableであるため、このインターフェイスを実装する必要があります。
  • 具体的なScrollDecoratorの実装では、Scrollableインスタンス変数と、Scrollable引数を取るコンストラクタがあります。
  • ScrollDecoratorコンストラクタをScrollable引数にすると、ScroallDecoratorは、Scrollableのインスタンスだけを飾ることができるように制限できるようになりました。

これは言語に依存しない質問なので、 "interface"と "implement"という単語をJavaプログラミング言語に関連付けるべきではなく、一般的な定義にするべきです。いえ、ここではJavaで上述の点の符号化バージョンである:

ましょう第1の溶液の最終的な所望の状態を見てみましょう:

Component window = new ScrollDecorator(new Window());//should be allowed 
Component dialog = new ScrollDecorator(new Dialog());//should not be allowed. 

スクロールバーとの対話を飾るしようとしますコンパイルエラーが発生します。

コンポーネント

public interface Component { 
    public void load(); 
} 

スクロール(マーカーインターフェイス)

public interface Scrollable extends Component { 

} 

コンクリートコンポーネント(ウィンドウ)

:今度はこれを可能にするためのクラスを見てみましょう
public class Window implements Scrollable { 

    @Override 
    public void load() { 
     //code for drawing a window.   
    } 

} 

コンクリートコンポーネント(ダイアログ)これは、.NETにJavaで注釈やカスタム属性です達成するために使用することができ

class Dialog implements Component { 

    @Override 
    public void load() { 
     //code for drawing a dialog.   
    } 

} 

ScrollDecorator

public class ScrollDecorator implements Component { 

    private Scrollable scrollable; 

    public ScrollDecorator(Scrollable scrollable) { 
     this.scrollable = scrollable; 
    } 

    @Override 
    public void load() { 
     scrollable.load(); 
     //code for drawing a scrollbar over the scrollable component 

    } 
} 

その他の言語固有のオプション。

+0

この方法は、あなたが飾りたいクラスを所有していても動作しますが、デコレータパターンはサードパーティのクラスでよく使われます。 'Window'と' Dialog'を制御できず、 'Dialog'が' Window'を拡張しているという事実を変えることはできませんか? – jaco0646

+0

@ jaco0646私はあなたがOPに尋ねるべき質問であると信じています。私の意見では、「あなたの**デコレータが互換性のないコンポーネントに適用されている場合はどうしますか? 「しかし、**私は**人々**のバカなことを避けるための戦略にもっと興味があります」とは、OPがAPIの所有者であることを示しています:)。つまり、開発者が愚かなことをするのを止める方法を実装しなければならないのはクライアントコードです。私はそれがOPがここで探しているものだとは思わない。 – CKing

関連する問題