が、私はあなたがmarkerインタフェースパターンを使用することによって、これを達成することができます愚かな
をしている人々を避けるための戦略でより興味があります。
Scrollable
というインターフェイスを定義します。
- スクロール機能をサポートするすべてのコンポーネントがこのインターフェイスを実装します。たとえば、
Window
はScrollable
であるため、このインターフェイスを実装する必要があります。
- 具体的な
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
}
}
その他の言語固有のオプション。
この方法は、あなたが飾りたいクラスを所有していても動作しますが、デコレータパターンはサードパーティのクラスでよく使われます。 'Window'と' Dialog'を制御できず、 'Dialog'が' Window'を拡張しているという事実を変えることはできませんか? – jaco0646
@ jaco0646私はあなたがOPに尋ねるべき質問であると信じています。私の意見では、「あなたの**デコレータが互換性のないコンポーネントに適用されている場合はどうしますか? 「しかし、**私は**人々**のバカなことを避けるための戦略にもっと興味があります」とは、OPがAPIの所有者であることを示しています:)。つまり、開発者が愚かなことをするのを止める方法を実装しなければならないのはクライアントコードです。私はそれがOPがここで探しているものだとは思わない。 – CKing