复合设计模式:我应该在 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()
的 Employee
s 实际上会保留在任何地方。
关于 Composite 设计模式:由多个 类 实现的接口应该只包含对 all 的 all 执行有意义的操作29=]。可能存在不这样做是个好主意的情况,但您应该仔细考虑可能调用 "not always meaningful" 方法的后果。特别是,您应该记录它,并考虑抛出异常而不是什么都不做。
您可以安全地添加到界面的相关操作是public List<Employee> getSubordinates()
。虽然 Developer
没有下属,但它仍然可以对这个操作做出有意义的反应:简单地 return 一个空列表。
不,你不应该。
检查 Composite pattern 的 UML 图。
您需要 add
和 remove
方法只用于 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);
}
............
............
}
我应该在父界面中使用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()
的 Employee
s 实际上会保留在任何地方。
关于 Composite 设计模式:由多个 类 实现的接口应该只包含对 all 的 all 执行有意义的操作29=]。可能存在不这样做是个好主意的情况,但您应该仔细考虑可能调用 "not always meaningful" 方法的后果。特别是,您应该记录它,并考虑抛出异常而不是什么都不做。
您可以安全地添加到界面的相关操作是public List<Employee> getSubordinates()
。虽然 Developer
没有下属,但它仍然可以对这个操作做出有意义的反应:简单地 return 一个空列表。
不,你不应该。
检查 Composite pattern 的 UML 图。
您需要 add
和 remove
方法只用于 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);
}
............
............
}