2015-11-06 38 views
0

我應該在父接口中使用add和remove方法嗎?複合設計模式:我應該在父界面中插入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); 
    } 
    ............ 
    ............ 
} 

我的設計是否符合複合設計模式?

+1

我會將這兩種方法都移入管理員專用接口,然後可以擴展'Empl oyee'。對我來說,「正常」員工可以「添加」或「刪除」其他員工是毫無意義的。 – Tom

+0

謝謝湯姆!我從互聯網上找到了這個代碼。 – Touchstone

回答

1

理想情況下,接口的方法將適用於所有實現類(並且具有非空實現)。在你的情況下,因爲Developer實際上不能有下屬,所以我會強烈推薦。使用目前的設計,接口的消費者不能依靠他們發送給add()的事實將被保留在任何地方。

至於複合設計模式:由幾個類實現的接口應該只包含有意義的在所有類上執行的操作。在其他情況下可能存在這樣的情況,否則你應該仔細考慮可能被調用的「並不總是有意義的」方法的後果。尤其是,你應該記錄它,並考慮拋出異常而不是無所事事。

相關操作你可能安全地添加到界面是public List<Employee> getSubordinates()。儘管Developer沒有下屬,但它仍然可能對此操作做出有意義的反應:只需返回一個空列表。

+0

那麼,在複合設計模式中,我們不會在父級中插入添加和刪除方法? – Touchstone

+0

接口應該在其實現者的_all_中具有任何有意義的操作。在你的情況下,添加/刪除並不總是有意義的。在其他情況下,他們可能是。 –

+0

謝謝Aasmund!你能舉個例子嗎? – Touchstone

0

不,你不應該。 檢查Composite pattern的UML圖。 你需要有隻爲Manager addremove方法,否則你的設計不匹配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); 
    } 
    ............ 
    ............ 
}