我可以使用哪种设计模式?

时间:2012-06-25 11:07:41

标签: java design-patterns

我想实现以下场景。 (实施例)

我有3个类:

  1. 控制器
  2. 苹果
  3. 汽车
  4. 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 个答案:

答案 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)

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

Factory pattern Example