1

簡単な答えは、stop()メソッドも含むすべての通常の操作とのインターフェースを持つことです。

interface Service {
   operation( parameters ...);
   somethingElse( parameters ... );

   stop();
}

stopメソッドの主な問題は、サービスへの参照を取得するほとんどのクライアントが、おそらくサービスも停止できないはずであるということです。

もう1つの方法は、サービスとStoppableの2つのインターフェースを単純に定義することです。

interface Service {
    operation( parameters ...);
    somethingElse( parameters ... );
}

interface Stoppable {
    void stop();
}

このアプローチの唯一の問題は、実装が別のサービスによってラップされている場合、stopメソッドが隠されていることです。

クライアントがサービスを「停止」するのを停止するという元々の問題は依然として発生する可能性があります。最初に参照がStoppableのインスタンスであるかどうかを確認してから、クライアントがそれを「停止」できるようにする必要があります。

この問題をどのように解決しますか?

私は、公共の停留所を利用できるようにすることなく、問題をエレガントに(私にとっては)解決するアイデアを持っています。しかし、それを示す前に、いくつかのアイデアが欲しいです。

4

2 に答える 2

-1

次のようなことができます

interface Service {
    operation( parameters ...);
    somethingElse( parameters ... );

    <E> E getControlInterface(Class<E> clazz);
}

その後

Stoppable stoppable = service.getControlInterface(Stoppable.class);
if (stoppable != null) {
    stoppable.stop();
}

しかし、これは複雑すぎると思いますStoppable。インターフェースを実装するだけで十分です。ラッパーもそれを認識しStoppableて実装する必要があります。

于 2011-01-20T14:21:07.057 に答える
-1

インターフェイスの継承を使用します。

interface Service {
    operation( parameters ...);
    somethingElse( parameters ... );
}


interface StoppableService extends Service {
    void stop();
}

生のサービスのみを必要とするクライアントは、適切なファクトリ メソッドによって与えられます。サービスを停止できる必要があるものはすべて、StoppableService を要求します。

StoppableService にキャストするクライアントが stop() を呼び出すことができるのではないかと心配している場合は、この関数を分離するために具体的な実装が必要になります。no-op バージョンの stop() を持つ具体的な実装を提供します。ファクトリに stop() の機能する実装を停止できるはずの誰にでも提供させることができます。おそらく、彼らがあなたの工場に実装を要求するとき、彼らは適切な資格情報を渡すことができるので、彼らが何をできるべきかを判断し、正しいバージョンを与えることができます.

于 2011-01-20T13:33:46.037 に答える