Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我可以使用哪种设计模式?_Java_Design Patterns - Fatal编程技术网

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

Java 我可以使用哪种设计模式?,java,design-patterns,Java,Design Patterns,我想实现以下场景。(示例) 我有三门课: 控制器 苹果 汽车 公共类Apple实现IBonus{ 公共字符串名称; 公共弦权; } 公共级轿车实现IBonus{ 公共字符串品牌; 公共字符串vmax; 公共权力; } 公共类控制器{ 公共列表值; 公共无效doWork(IBonus bonusObject){ if(汽车的bonusObject实例){ carc=(Car)bonusObject; 添加(c.品牌); 添加(c.vmax); 加上(c.power); } if(苹果的bonus

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

我有三门课:

  • 控制器
  • 苹果
  • 汽车
  • 公共类Apple实现IBonus{ 公共字符串名称; 公共弦权; } 公共级轿车实现IBonus{ 公共字符串品牌; 公共字符串vmax; 公共权力; } 公共类控制器{ 公共列表值; 公共无效doWork(IBonus bonusObject){ if(汽车的bonusObject实例){ carc=(Car)bonusObject; 添加(c.品牌); 添加(c.vmax); 加上(c.power); } if(苹果的bonusObject实例){ 苹果a=(苹果)bonusObject; 添加(a.name); 加上(a.重量); } } } 现在,我有很多课程,像苹果和汽车。在不久的将来,每个类的一些变量也有可能被改变、添加或删除。 这意味着我必须始终调整控制器类中的代码


    有人知道合适的式样吗?

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

    编辑:设计模式“访问者”

    更改iBonus接口以添加方法:

    void add(List<String> values);
    
    public List<String> getValues();
    
    通过这种方式,您可以将特定任务(将对象添加到“值”)委托给特定实现

    基本上,无论何时发现自己编写代码(如StimeOf或Switcor)时,应考虑将任务委托给抽象方法。

    你可能想考虑“双重派遣”。“访客”

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

    在该场景中,您有两个接口:一个用于奖金对象,另一个用于控制器。bonus对象有一个名为

    void visit(Controller c);
    
    然后,控制器将调用奖金对象,因此:

    bonusObjecv.visit(this);
    

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

    您可以添加一个方法:

    void add(List<String> values);
    
    public List<String> getValues();
    

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

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

    public interface IBonus {
        void fillStringList(List<String> values);
    }
    ...
    
    public void doWork(IBonus bonusObject){
       bonusObject.fillStringList(values);
    }
    
    公共接口IBonus{
    void fillStringList(列表值);
    }
    ...
    公共无效doWork(IBonus bonusObject){
    bonusObject.fillStringList(值);
    }
    
    我敢打赌,他们也会为这一款命名!模板方法,也许?不。模板方法是一种通过实现公共部分并将特定部分委托给子类中重写的方法来完成一些复杂工作的方法。看见我会称之为多态性。因此,如果
    doWork
    通过实现公共部分并委托给
    fillStringList
    以获取子类特定的细节来完成一些复杂的工作,那么这里就没有继承。仅仅是一个对象使用另一个接口类型的对象,而不关心所用对象的具体类型。以及接口的具体实现,每个接口都以自己的方式实现方法。这是多态性的基本概念。如此基本以至于它没有模式名。这是您在调用接口方法或超类方法时一直在做的事情。您的描述“非常基本…”适合一半的模式,这些模式的名称为:)在这种情况下,控制器和模型类之间的特定协作(控制器拥有集合,接口方法填充集合)是可以提取的特定模式,其复杂性已经达到模板级别。
    public interface IBonus {
        void fillStringList(List<String> values);
    }
    ...
    
    public void doWork(IBonus bonusObject){
       bonusObject.fillStringList(values);
    }