我想实现以下场景。 (实施例)
我有3个类:
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);
}
}
}
现在,我有很多像苹果和汽车这样的课程。并且还有可能在不久的将来更改,添加或删除每个类的一些变量。 这意味着我总是要调整控制器类中的代码。
有没有人知道合适的模式?
答案 0 :(得分:7)
您不需要任何模式。只是简单的旧多态:
public interface IBonus {
void fillStringList(List<String> values);
}
...
public void doWork(IBonus bonusObject){
bonusObject.fillStringList(values);
}
答案 1 :(得分: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等通用类。这样就可以使控制器和访问对象之间的交互显式化。
答案 2 :(得分:2)
您可以添加方法:
public List<String> getValues();
到您的IBonus界面,只需在doWork中使用以下内容:
values.addAll(bonusObject.getValues());
然后,每个IBonus类型都需要实现如何创建列表。
答案 3 :(得分:-2)
我认为工厂模式适合这种情况。