2013-02-15 9 views
6

私は所有していないクラスの実装を隠そうとしています。私はクラスを拡張し、自分のインターフェイスを実装するこれをやりたいJava OO:これも可能ですか?

QueueInfo info = admin.getQueue(queueName); 

QueueInfoは私が所有していないクラスです。このオブジェクトのインスタンスを取得するには、取得するために管理オブジェクトを使用する必要があります。私は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); 
    } 

} 

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

私はプライベートvarialbe経由のすべてのメソッドへのアクセスを取得し、私のEMSQueueInfoクラスから延び取り除き、自分自身アップオブジェクトをラップしている見ている唯一のソリューション:

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実装にアクセスすることができるため、これをすべて実行しています。どんな助けも素晴らしいだろう!

+0

私は、あなたが隠そうとしているクラスを拡張することには注意が必要です。私は構成上の問題は見ません。 –

+0

Googleファクトリメソッド – Bohemian

+0

「アダプタ」パターンについて説明しました。その一部の部分にのみアクセスできるようにラップします。だからあなたは**そのqueueInfoを隠しておきたい。そうしないと、人々はあなたが望むものだけでなく、その上のすべてのフィールドにアクセスすることができます。 –

答えて

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です。元のクラスを拡張する必要はありません。

それはあなたが持っているように実装するの苦痛を感じることができるのに苦労し、あなたのQueueInfoProviderだけ面白い方法QueueInfoからをコピーしますが、痛みは最終的にはそれだけの価値になります。

このアプローチでは、アプリケーションを直接制御できないAPIから切り離すことができます。その意味では、それはFacade patternに似ています。

+1

申し訳ありませんが、私は.NETから来ています。繰り返しますが、私はクラス全体をラップしたくありません。上記のアプローチは私が避けているものです。 getMessagesOnQueueはすでにQueueInfoの一部です。 –

+0

これは問題ありません。このデザインでは、どのメソッドをラップするかを選択できます。それが単なるものなら、それはいいです。 –

+0

あなたは正しいと思います。私はクラスを拡張するときにそれを行う正しい方法のように感じるすべてを書き直すことを少し汚いと感じました。 –

6

あなたが使用しているソリューションが、あなたが嫌い​​だと言っていることは良い解決策だと思います。 OOを壊したり、誤用したりすることはありません。

あなたがやっていることは、Adapter patternObject Adapter pattern)というよく知られているパターンです。あなたのクラスで必要とされないものだけがQueueInfoを拡張しています。

+0

あなたの答えも正しいです。私がDuncanをあなたの上で受け入れた唯一の理由は、彼が良いコード例も提供したからです。あなたの入力をありがとう! –

関連する問題