6

所有していないクラスの実装を非表示にしようとしています。これを実行して、クラスを拡張し、独自のインターフェイスを実装したいと思います。必要なクラスのインスタンスを作成する方法は次のとおりです。

QueueInfo info = admin.getQueue(queueName);

QueueInfoは私が所有していないクラスです。このオブジェクトのインスタンスを取得するには、adminオブジェクトを使用して取得する必要があります。IQueueInfoと呼ばれるインターフェイスを介して作業することにより、この実装を非表示にしたいと考えています。IQueueInfoは、消費者がQueueInfoから必要とするものへのアクセスを提供するだけです。したがって、このQueueInfoを取得するには、EMSQueueInfoと呼ばれる独自のオブジェクトを使用して作業します。これが私がこれを設定することをどのように想像するかです:

public class EMSQueueInfo extends QueueInfo implements IQueueInfo {
    //...
}

これにより、コンシューマーはインターフェイスIQueueInfoを介して作業できるようになり、基盤となるEMSQueueInfoがQueueInfoのすべてにアクセスできるようになります。私の問題は、QueueInfoの「ライブ」インスタンスを取得することにあります。QueueInfoの通常のインスタンスを取得するには、次のように言うことができます。

QueueInfo info = new QueueInfo(queueName);

このインスタンスは、管理オブジェクトによって作成されていないため、「ライブ」ではありません。だから、これを行う:

public class EMSQueueInfo extends QueueInfo implements IQueueInfo {

    public EMSQueueInfo(String queueName){
        super(queueName);
    }

}

「ライブ」オブジェクトは提供されません。私ができることを望んでいるのは、次のようなものです。

public class EMSQueueInfo extends QueueInfo implements IQueueInfo {

    public EMSQueueInfo(String queueName, Admin admin){
        super = admin.getQueue(queueName);
    }

}

しかし、それは不可能です。

私が見ている唯一の解決策は、EMSQueueInfoクラスからextendsを削除し、オブジェクトを自分でラップして、プライベート変数を介してすべてのメソッドにアクセスすることです。

public class EMSQueueInfo extends QueueInfo implements IQueueInfo {

    private QueueInfo _queueInfo

    public EMSQueueInfo(String queueName, Admin admin){
        _queueInfo = admin.getQueue(queueName);
    }

    public int getMessagesOnQueue() {
        return _queueInfo.getMessagesOnQueue();
    }

}

その解決策は機能しますが、私はそれが嫌いです。誰かがより良い方法を考えることができますか?OOを壊して誤用しようとしているだけですか?繰り返しになりますが、コンシューマーがIQueueInfoを使用できるようにしたいので、これらすべてを実行しているだけです。将来的には、IQueueInfoを使用してQueueInfoのJMS実装またはQueueInfoのMSMQ実装にアクセスできるようになる可能性があります。どんな助けでも素晴らしいでしょう!

4

2 に答える 2

6

あなたが嫌い​​だと言っているあなたが使用している解決策は、良い解決策だと思います。OO を壊したり、悪用したりしません。

あなたが行っているのはAdapter パターン( Object Adapter パターン) と呼ばれるよく知られたパターンです。クラスで必要のない唯一のものは、QueueInfo を拡張することです。

于 2013-02-15T14:01:34.430 に答える
5

あなたが提案したことは完全に合理的だと思われます-それはアダプターパターンと呼ばれます(Martinsosに感謝します)。

Admin何らかの形でオブジェクトをクラス内に隠すことができればもっといいでしょう。例えば

public class EMSQueueInfo implements QueueInfoProvider {

    private static Admin admin = new Admin();
    private QueueInfo queueInfo

    public EMSQueueInfo(String queueName){
        queueInfo = admin.getQueue(queueName);
    }

    public int getMessagesOnQueue() {
        return queueInfo.getMessagesOnQueue();
    }

}

あなたのインターフェースにもっと「Java」の名前を付けようとしました。サフィックスはI非常に .NET です。元のクラスを拡張する必要はありません。

から 興味深いメソッドだけQueueInfoを苦労して にコピーする必要があるため、実装するのは苦痛に感じるかもしれませんがQueueInfoProvider、最終的にはその苦痛に見合うだけの価値があります。

このアプローチは、直接制御できない API からアプリケーションを分離します。そういう意味ではFacade パターンと似ています。

于 2013-02-15T14:00:38.650 に答える