有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我检测到我正在系统地重复命名bean中的代码,因此我正在寻找一种方法来重新组织代码

例如,我有三个命名bean,它们重复了关于项圈的代码:

@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
    }
  }

所以bean CatControllerBirdController也有相同的代码。同样的情况也发生在Photo上,它们都重复代码。所以我想我是在一个模式后面

我的直接步骤是为DogCatBird创建一个interface HasCollar。然后我将重复的代码移动到一个新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) 个答案

  1. # 1 楼答案

    考虑^ {CD1>}和^ {< CD2>}之间的关系:A^ {} HAS-^ {}。

    换句话说,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

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