重构命名bean以避免代码重复

时间:2019-05-10 17:14:57

标签: java jsf-2

我检测到我正在语义化地重复命名的bean中的代码,因此我正在寻找一种重组代码的方法。

例如,我有三个命名的bean,它们重复了有关Collars的这段代码:

@Named(value = "dogController")
@ViewScoped
public class DogController implements Serializable {

    private Dog dog;  // Class Dog has a List<Collar>
    private Collar collar = new Collar();  // to be used in an XHTML form
    ....
    public addCollar(){
        //adds collar in dog
    }
    public removeCollar(){
        //removes collar from dog
    }
  }

因此,豆CatControllerBirdController也具有相同的代码。 Photo也会发生同样的情况,所有这些重复代码。所以我认为我在这里落后了。

我的直接步骤是为interface HasCollarDogCat创建一个Bird。然后,将重复的代码移到新的bean中:

@Named(value = "collarController")
@ViewScoped
public class CollarController implements Serializable {

    private HasCollar animal;
    private Collar collar = new Collar();  // to be used from the XHTML
    ....
    public addCollar(){
        //adds collar in animal
    }
    public removeCollar(){
        //removes collar from animal
    }
  }

到目前为止,一切都很好。我现在的问题是:

  • 如何初始化animal?尤其是因为同一XHTML可能同时使用DogCat。之前还不错,因为每种类型都有一个Collar对象。如果必须注射,我不知道如何注射。 (该问题似乎与this类似,但略有不同)。
  • 通常我会从CollarController扩展命名的bean,并重用所有功能,但这是不可能的,因为命名的bean已经继承自另一个类。

那么,我如何重构这种情况以减少重复的代码?

(请让我知道是否需要更多信息)

1 个答案:

答案 0 :(得分:1)

考虑DogCollar之间的关系:一个Dog有一个Collar

换句话说,addCollar()removeCollar()Dog的动作,因此这些方法属于Dog内部:

 public class Dog {
    public addCollar(){
        //adds collar
    }
    public removeCollar(){
        //removes collar
    }
}

CatBird等相同。此刻代码仍然重复。

然后,控制器可以简单地委派:

@Named(value = "dogController")
@ViewScoped
public class DogController implements Serializable {
    private Dog dog;  // Class Dog has a List<Collar>
    private Collar collar = new Collar();  // to be used in an XHTML form

    public addCollar(){
        //adds collar in dog
        dog.addCollar();
    }
    public removeCollar(){
        //removes collar from dog
        dog.removeCollar();
    }
}

CatBird等控制器相同。

现在可以将通用代码放在单个类中,例如:

public class CollarHandler {
    private List<Collar> collars;
    public addCollar(){
        //adds collar
    }
    public removeCollar(){
        // remove a collar;
    }
}

Dog的构造函数使用CollarHandler,其方法委托给处理程序:

public class Dog {
    private CollarHandler collarHandler;
    public Dog(CollarHandler collarHandler) {this.collarHandler = collarHandler; }

    public addCollar(){
        collarHandler.addCollar();
    }
    public removeCollar(){
        collarHandler.removeCollar();
    }
}

CatBird等相同。

没有通用接口也没有继承。每个控制器仍然是独立的,但是行为可以共享。