2017-05-18 6 views
0

2つのインターフェイス(下に表示)、通常/フリーキット用と購入可能なキット用のインターフェイスが1つあります。彼らはどちらも2つのメソッドを含んでいますが、購入可能なキットの「getIcon」メソッドでは、プレーヤーのプロファイルがパラメータとして必要となり、キットを購入したかどうか確認できます。Java - デザインパターンを選択する - 2つのインターフェイス(同じものに余分なパラメータがある場合を除く)

これらの2つのインターフェイスをリンクするために使用する最適なデザインパターンは何ですか?あなたが私にそれを行うコードを表示することはできますか?

2つのインターフェイス:

public interface Kits { 

    void giveKit(Player player); 

    Item getIcon(); 
} 


public interface PurchasableKits { 

    void giveKit(Player player); 

    Item getIcon(Profile profile); 
} 

私はAdapterパターンを使用しようとしましたが、それはないと思える「getIcon」メソッドは、パラメータとしてプロファイルに取っているので、それは使用されません。 。事前

+0

私はこれらのインターフェイスの目的を理解しているかどうかは分かりませんが、少なくとも 'public interface PurchasableKits extends Kits'を作成することで、複製された' giveKit() 'メソッドを削除できます。そのサブインターフェースは 'Item getIcon(Profile profile)'メソッドしか持たないでしょう。 –

答えて

1

public class KitAdapter implements PurchasableKits { 

    private Kits kits; 

    public KitAdapter(Kits kits) { 
     this.kits = kits; 
    } 

    @Override 
    public void givetKit(Player player){ 
     kits.giveKit(player); 
    } 

    @Override 
    public void getIcon(Profile profile){ 
     kits.getIcon(); 
    } 

} 

おかげであなたは1つのインターフェイスPurchasableKitsを持っています。無料のキットがインターフェイスを実装し、getIcon(null)と呼ぶでしょう。

赤い旗は、2つのインターフェイスがほぼ同じものです。作成する状況からあなたを取り除くデザインパターンはありません。

+0

それに渡された 'Profile'は無視してください。 –

+0

応答ありがとう!私は実際に最初に1つのインターフェイスを持っていたが、私はほとんどの時間がnullを渡していたので、私のデザインが悪いと思った。しかし、私はちょうど私がデザインパターンについて学んだので、それを考えるのをやめ始めたと思う。 – BlueNinja

0

これはJavaで回避される継承と循環継承のルールのために難しい質問です。

私はあなたがこのような何かを行うことができ、あなたがインターフェイスに必要とは考えていない:

public interface Kits { 

    void giveKit(Player player); 

    //a vargars usage 
    Item getIcon(Profile... p); 
} 

public class ConcreteClass implements Kits{ 

    @Override 
    public void giveKit(Player player) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public Item getIcon(Profile... o) { 
     //This is the ugly thing of this method. You must check the sent params. 
     //However I think it is better than send a null param, as the clean code suggest to avoid 
     if(o.length == 0) 
      System.out.println("without profile"); 
     else 
      System.out.println("With profile"); 
     return null; 
    } 

} 

public class Main { 

    public static void main(String[] args) { 
     ConcreteClass my = new ConcreteClass(); 
     my.getIcon(); 
     my.getIcon(new Profile()); 
    } 
} 

出力:プロファイルとプロファイル なし

0

は、だから私は2つのインタフェースを持っています(以下に示す)、レギュラー/フリーキットは1、購入キットはもう1つ。彼らはどちらも2つのメソッドを含んでいますが、購入可能なキットの「getIcon」メソッドでは、プレーヤーのプロファイルがパラメータとして必要となり、キットを購入したかどうか確認できます。プロファイルはgetIcon(...)方法で必要とされるか否か

は購入可能であるものKit Sの実装の詳細です。私は次のように定義されているKitインタフェースを持っているでしょう:

public interface Kit { 
    void giveKit(Player player); 
    Item getIcon(Profile profile); 
} 

ですから、あなたがProfileに渡すのアイコンを取得したいし、それが見て購入されているキットまでになり毎回プロフィール。自由な人は議論を無視します。あなたは時々nullを渡すこともありますし、時にはそれがあなたのモデルに何か問題があることを意味する無料であるかどうかを事前に知っていることを意味しません。

あなたのコードに関する他のコメントがいくつかあります。ちょうど私の意見:

  • 具体的なクラスは名詞になる傾向があります。インタフェースは動詞になる傾向があります。たぶん、Kitの代わりにKitHandlerがありますか?
  • クラス名は単数なので、リストに入れることができます。たぶんKit(またはKitHandler)は、List<Kit> kits = ...を作成する方が良いでしょう。
  • フィールドを返すgetメソッドを使用しました。これは、通常、引数を取らないことを意味します。たぶんgetIcongenerateIcon(...)になるはずですか?
+0

フィードバックありがとう!私は自分のコードを1つのインターフェースに変更し、あなたの名前の提案を使用しました。彼らはもっと意味を成しています – BlueNinja

関連する問題