Java的設計形式編程中迪米特軌則的運用示例。本站提示廣大學習愛好者:(Java的設計形式編程中迪米特軌則的運用示例)文章只能為提供參考,不一定能成為您想要的結果。以下是Java的設計形式編程中迪米特軌則的運用示例正文
界說:一個對象應當對其他對象懂得起碼
迪米特軌則的焦點不雅念就是類間解耦,弱耦合,只要弱耦合了今後,類的復用性才可以進步。
抽象一點的比方相似於:牢獄內的罪人是不該該跟裡面的人接觸的,固然也許會有投親的。這裡的牢獄就是類,外面的罪人就是類外部的信息,而牢獄裡的獄警就相當於迪米特軌則的履行者
迪米特軌則主意:
(1)在類的劃分上,應當創立有弱耦合的類;
(2)在類的構造設計上,每個類都應該盡可能下降成員的拜訪權限;
(3)在類的設計上,只需有能夠,一個類應該設計成不變類;
(4)在對其他類的援用上,一個對象對其它對象的援用應該降到最低;
(5)盡可能下降類的拜訪權限;
(6)謹嚴應用序列化功效;
(7)不要裸露類成員,而應當供給響應的拜訪器(屬性)。
舉一個例子:有一個團體公司,部屬單元有分公司和直屬部分,如今請求打印出一切部屬單元的員工ID。先來看一下違背迪米特軌則的設計。
//總公司員工
class Employee{
private String id;
public void setId(String id){
this.id = id;
}
public String getId(){
return id;
}
}
//分公司員工
class SubEmployee{
private String id;
public void setId(String id){
this.id = id;
}
public String getId(){
return id;
}
}
class SubCompanyManager{
public List<SubEmployee> getAllEmployee(){
List<SubEmployee> list = new ArrayList<SubEmployee>();
for(int i=0; i<100; i++){
SubEmployee emp = new SubEmployee();
//為分公司人員按次序分派一個ID
emp.setId("分公司"+i);
list.add(emp);
}
return list;
}
}
class CompanyManager{
public List<Employee> getAllEmployee(){
List<Employee> list = new ArrayList<Employee>();
for(int i=0; i<30; i++){
Employee emp = new Employee();
//為總公司人員按次序分派一個ID
emp.setId("總公司"+i);
list.add(emp);
}
return list;
}
public void printAllEmployee(SubCompanyManager sub){
List<SubEmployee> list1 = sub.getAllEmployee();
for(SubEmployee e:list1){
System.out.println(e.getId());
}
List<Employee> list2 = this.getAllEmployee();
for(Employee e:list2){
System.out.println(e.getId());
}
}
}
public class Client{
public static void main(String[] args){
CompanyManager e = new CompanyManager();
e.printAllEmployee(new SubCompanyManager());
}
}
如今這個設計的重要成績出在CompanyManager中,依據迪米特軌則,只與直接的同伙產生通訊,而SubEmployee類其實不是CompanyManager類的直接同伙(以部分變量湧現的耦合不屬於直接同伙),從邏輯上講總公司只與他的分公司耦合就好了,與分公司的員工並沒有任何接洽,如許設計明顯是增長了不用要的耦合。依照迪米特軌則,應當防止類中湧現如許非直接同伙關系的耦合。修正後的代碼以下:
class SubCompanyManager{
public List<SubEmployee> getAllEmployee(){
List<SubEmployee> list = new ArrayList<SubEmployee>();
for(int i=0; i<100; i++){
SubEmployee emp = new SubEmployee();
//為分公司人員按次序分派一個ID
emp.setId("分公司"+i);
list.add(emp);
}
return list;
}
public void printEmployee(){
List<SubEmployee> list = this.getAllEmployee();
for(SubEmployee e:list){
System.out.println(e.getId());
}
}
}
class CompanyManager{
public List<Employee> getAllEmployee(){
List<Employee> list = new ArrayList<Employee>();
for(int i=0; i<30; i++){
Employee emp = new Employee();
//為總公司人員按次序分派一個ID
emp.setId("總公司"+i);
list.add(emp);
}
return list;
}
public void printAllEmployee(SubCompanyManager sub){
sub.printEmployee();
List<Employee> list2 = this.getAllEmployee();
for(Employee e:list2){
System.out.println(e.getId());
}
}
}
修正後,為分公司增長了打印人員ID的辦法,總公司直接挪用來打印,從而防止了與分公司的員工產生耦合。
迪米特軌則的初志是下降類之間的耦合,因為每一個類都削減了不用要的依附,是以切實其實可以下降耦合關系。然則凡事都有度,固然可以免與非直接的類通訊,然則要通訊,必定會經由過程一個“中介”來產生接洽,例如本例中,總公司就是經由過程分公司這個“中介”來與分公司的員工產生接洽的。過火的應用迪米特准繩,會發生年夜量如許的中介和傳遞類,招致體系龐雜度變年夜。所以在采取迪米特軌則時要重復衡量,既做到構造清楚,又要高內聚低耦合。