Java - 选择设计模式 - 使用相同方法的2个接口,除了一个具有额外参数

时间:2017-05-18 23:23:16

标签: java interface

所以我有2个接口(如下所示),1个用于常规/免费套件,另一个用于可购买套件。它们都包含两种方法,但在可购买套件的“getIcon”方法中,我需要将播放器的配置文件作为参数,以便检查他们是否购买了该套件。

用于链接这两个接口的最佳设计模式是什么?你能告诉我代码吗?

2个接口:

public interface Kits {

    void giveKit(Player player);

    Item getIcon();
}


public interface PurchasableKits {

    void giveKit(Player player);

    Item getIcon(Profile profile);
}

我尝试使用适配器模式,但它似乎不正确,因为“getIcon”方法将配置文件作为参数但不会被使用。

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();
    }

}

提前致谢

3 个答案:

答案 0 :(得分:1)

您有1个界面PurchasableKits。一个免费的工具包将实现该接口并调用getIcon(null)

红旗是2个界面几乎完全相同。没有设计模式可以让你摆脱创造的情况。

答案 1 :(得分: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());
    }
}

输出: 没有个人资料 随着个人资料

答案 2 :(得分:0)

  

所以我有2个接口(如下所示),1个用于常规/免费套件,另一个用于可购买套件。它们都包含两种方法,但在" getIcon"可购买套件的方法,我需要播放器的配置文件作为参数,以便我可以检查他们是否购买了套件。

getIcon(...)方法中是否需要配置文件是可购买的Kit的实施细节。我只有一个Kit接口,其定义如下:

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

因此,每当您想要获得图标时,您都会通过Profile传递图标,这取决于可以购买以查看配置文件的工具包。免费的人会忽略这个论点。您有时会传入null,有时并不意味着您事先知道它是否是免费的,这意味着您的模型出了问题。

关于您的代码的其他一些评论。只是我的意见:

  • 具体课程往往是名词。接口往往是动词。也许KitHandler代替Kit
  • 类名往往是单数,因此您可以将它们放在列表中。也许Kit(或KitHandler)会更好,因此您可以创建List<Kit> kits = ...
  • 我使用get方法返回字段,这意味着他们通常不会接受参数。也许getIcon应该是generateIcon(...)