复合设计模式:我应该在 Parent 接口中插入 add() 和 remove() 吗?

Composite Design Pattern: Should I insert add() and remove() in the Parent interface?

我应该在父界面中使用add和remove方法吗?

public interface Employee {

   public void add(Employee employee);
   public void remove(Employee employee);
   public void print();

}

Developer implements Employee{
.  @Override
   public void add(Employee employee) {
   //this is leaf node so this method is not applicable to this class.
   }

   @Override
   public void remove(Employee) {
   //this is leaf node so this method is not applicable to this class.
   }
   ..... 
   ......
}

Manager implements Employee{
    List<Employee> employees = new ArrayList<Employee>();

    public void add(Employee employee) {
       employees.add(employee);
    }    

    @Override
    public void remove(Employee employee) {
      employees.remove(employee);
    }
    ............
    ............
}

我的设计符合复合设计模式吗?

理想情况下,接口的方法将适用于(并且具有非空实现)所有实现 类。在你的情况下,由于 Developer 实际上不能有下属,我会 强烈 建议不要这样做。在当前的设计中,接口的消费者不能相信他们发送到 add()Employees 实际上会保留在任何地方。

关于 Composite 设计模式:由多个 类 实现的接口应该只包含对 allall 执行有意义的操作29=]。可能存在不这样做是个好主意的情况,但您应该仔细考虑可能调用 "not always meaningful" 方法的后果。特别是,您应该记录它,并考虑抛出异常而不是什么都不做。

可以安全地添加到界面的相关操作是public List<Employee> getSubordinates()。虽然 Developer 没有下属,但它仍然可以对这个操作做出有意义的反应:简单地 return 一个空列表。

不,你不应该。 检查 Composite pattern 的 UML 图。 您需要 addremove 方法只用于 Manager 否则你的设计将不匹配 Interface segregation principle

我会推倒Employee的方法:

   public void add(Employee employee);
   public void remove(Employee employee);

在另一个界面中:

public interface SuperiorEmployee extends Employee {

       public void add(Employee employee);
       public void remove(Employee employee);
}

Manager implements SuperiorEmployee {
    List<Employee> employees = new ArrayList<Employee>();

    public void add(Employee employee) {
       employees.add(employee);
    }    

    @Override
    public void remove(Employee employee) {
      employees.remove(employee);
    }
    ............
    ............
}