2

我喜欢实现以下场景。(例子)

我有 3 个课程:

  1. 控制器
  2. 苹果

public class Apple implements IBonus {
    public String name;
    public String weight;
}


public class Car implements IBonus{
    public String brand;
    public String vmax;
    public String power;
}

public class Controller {
    public List<String> values;

    public void doWork(IBonus bonusObject){
       if(bonusObject instanceOf Car){
          Car c = (Car)bonusObject;
          values.add(c.brand);
          values.add(c.vmax);
          values.add(c.power);
       }
       if(bonusObject instanceOf Apple){
          Apple a = (Apple)bonusObject;
          values.add(a.name);
          values.add(a.weight);
       }
    }
}

现在,我有很多类,比如苹果和汽车。并且也有可能在不久的将来每个类的一些变量将被更改、添加或删除。这意味着我总是必须调整控制器类中的代码。

有谁知道合适的模式?

4

4 回答 4

7

你不需要任何模式。只是普通的旧多态性:

public interface IBonus {
    void fillStringList(List<String> values);
}
...

public void doWork(IBonus bonusObject){
   bonusObject.fillStringList(values);
}
于 2012-06-25T11:12:32.533 回答
4

编辑:设计模式“访客”。

更改您的 iBonus 界面以添加方法:

void add(List<String> values);

让控制器代替

bonusObject.add(values);

通过这种方式,您可以将特定任务(将对象添加到“值”)委托给特定的实现。

基本上,每当您发现自己在编写上述代码时(如果是 instanceof 或 switch()),您应该考虑将任务委托给抽象方法。

您可能需要考虑“双重调度”又名。“游客”

http://en.wikipedia.org/wiki/Visitor_pattern

Wikipedia 版本非常通用,将“访问者”逻辑(添加到列表中)拆分为单独的类。在下面的版本中,“Bonus”对象扮演了这个角色,并且使用了双重调度结构。

在这种情况下,您有两个接口:一个用于奖励对象,一个用于控制器。奖励对象有一个名为的方法

void visit(Controller c);

然后控制器将调用奖励对象:

bonusObjecv.visit(this);

“访问者”的目的主要是让您改变彼此独立的实现。它是简单多态解决方案的更通用版本。您可以使用 Controller 接口,而不是使用 List 等泛型类。这样你就可以明确控制器和访问对象之间的交互。

于 2012-06-25T11:11:07.150 回答
2

您可以添加一个方法:

public List<String> getValues();

到您的 IBonus 界面,只需在 doWork 中使用以下内容:

values.addAll(bonusObject.getValues());

然后,每个 IBonus 类型都需要实现如何创建列表。

于 2012-06-25T11:12:01.103 回答
-2

我认为工厂模式适合这种情况。

工厂模式示例

于 2012-06-25T11:10:05.763 回答