Java設(shè)計(jì)模式之迪米特原則精解_第1頁(yè)
Java設(shè)計(jì)模式之迪米特原則精解_第2頁(yè)
Java設(shè)計(jì)模式之迪米特原則精解_第3頁(yè)
Java設(shè)計(jì)模式之迪米特原則精解_第4頁(yè)
Java設(shè)計(jì)模式之迪米特原則精解_第5頁(yè)
已閱讀5頁(yè),還剩1頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第Java設(shè)計(jì)模式之迪米特原則精解目錄1.什么是迪米特原則?2.違反迪米特原則代碼案例3.遵守迪米特原則代碼案例4.迪米特原則的注意事項(xiàng)

1.什么是迪米特原則?

一個(gè)對(duì)象應(yīng)該對(duì)其他對(duì)象保持最少的了解。

類與類關(guān)系越密切,耦合度越大。

迪米特法則(DemeterPrinciple)又叫最少知道原則,即一個(gè)類對(duì)自己依賴的類知道的越少越好。也就是說(shuō),對(duì)于被依賴的類不管多么復(fù)雜,都盡量將邏輯封裝在類的內(nèi)部。對(duì)外除了提供的public方法,不對(duì)外泄露任何信息。

迪米特法則還有個(gè)更簡(jiǎn)單的定義:只與直接的朋友通信。

直接的朋友:每個(gè)對(duì)象都會(huì)與其他對(duì)象有耦合關(guān)系,只要兩個(gè)對(duì)象之間有耦合關(guān)系,我們就說(shuō)這兩個(gè)對(duì)象之間是朋友關(guān)系。耦合的方式很多,依賴,關(guān)聯(lián),組合,聚合等。其中,我們稱出現(xiàn)成員變量,方法參數(shù),方法返回值中的類為直接的朋友,而出現(xiàn)在局部變量中的類不是直接的朋友。也就是說(shuō),陌生的類最好不要以局部變量的形式出現(xiàn)在類的內(nèi)部。

2.違反迪米特原則代碼案例

代碼中的注釋我已經(jīng)寫(xiě)的很詳細(xì)了,大家有問(wèn)題即可指出。

packagecom.szh.principle.demeter;

importjava.util.ArrayList;

importjava.util.List;

//學(xué)??偛繂T工類

classEmployee{

privateStringid;

publicvoidsetId(Stringid){

this.id=id;

publicStringgetId(){

returnid;

//學(xué)院的員工類

classCollegeEmployee{

privateStringid;

publicvoidsetId(Stringid){

this.id=id;

publicStringgetId(){

returnid;

//管理學(xué)院?jiǎn)T工的管理類

classCollegeManager{

//返回學(xué)院的所有員工

publicListCollegeEmployeegetAllEmployee(){

ListCollegeEmployeelist=newArrayList();

for(inti=1;ii++){//這里我們?cè)黾恿?個(gè)員工到list

CollegeEmployeeemp=newCollegeEmployee();

emp.setId("學(xué)院?jiǎn)T工id="+i);

list.add(emp);

returnlist;

//學(xué)校管理類

//分析SchoolManager類的直接朋友類有哪些:Employee、CollegeManager

//CollegeEmployee不是直接朋友,而是一個(gè)陌生類,這樣違背了迪米特法則

classSchoolManager{

//返回學(xué)??偛康膯T工

publicListEmployeegetAllEmployee(){

ListEmployeelist=newArrayList();

for(inti=1;ii++){//這里我們?cè)黾恿?個(gè)員工到list

Employeeemp=newEmployee();

emp.setId("學(xué)校總部員工id="+i);

list.add(emp);

returnlist;

//該方法完成輸出學(xué)??偛亢蛯W(xué)院?jiǎn)T工信息(id)

voidprintAllEmployee(CollegeManagersub){

//分析問(wèn)題

//1.這里的CollegeEmployee不是SchoolManager的直接朋友

//2.CollegeEmployee是以局部變量方式出現(xiàn)在SchoolManager

//3.違反了迪米特法則

//獲取到學(xué)院?jiǎn)T工

ListCollegeEmployeelist1=sub.getAllEmployee();

System.out.println("------------學(xué)院?jiǎn)T工------------");

list1.stream().map(CollegeEmployee::getId).forEach(System.out::println);

//獲取到學(xué)??偛繂T工

ListEmployeelist2=this.getAllEmployee();

System.out.println("------------學(xué)校總部員工------------");

list2.stream().map(Employee::getId).forEach(System.out::println);

publicclassDemeter{

publicstaticvoidmain(String[]args){

//創(chuàng)建了一個(gè)SchoolManager對(duì)象

SchoolManagerschoolManager=newSchoolManager();

//輸出學(xué)院的員工id和學(xué)??偛康膯T工信息

schoolManager.printAllEmployee(newCollegeManager());

}

3.遵守迪米特原則代碼案例

前面設(shè)計(jì)的問(wèn)題在于SchoolManager中,CollegeEmployee類并不是SchoolManager類的直接朋友。

按照迪米特法則,應(yīng)該避免類中出現(xiàn)這樣非直接朋友關(guān)系的耦合。我們將上面的代碼進(jìn)行修改,使其遵守迪米特原則。

packagecom.szh.principle.demeter.improve;

importjava.util.ArrayList;

importjava.util.List;

//學(xué)校總部員工類

classEmployee{

privateStringid;

publicvoidsetId(Stringid){

this.id=id;

publicStringgetId(){

returnid;

//學(xué)院的員工類

classCollegeEmployee{

privateStringid;

publicvoidsetId(Stringid){

this.id=id;

publicStringgetId(){

returnid;

//管理學(xué)院?jiǎn)T工的管理類

classCollegeManager{

//返回學(xué)院的所有員工

publicListCollegeEmployeegetAllEmployee(){

ListCollegeEmployeelist=newArrayList();

for(inti=1;ii++){//這里我們?cè)黾恿?個(gè)員工到list

CollegeEmployeeemp=newCollegeEmployee();

emp.setId("學(xué)院?jiǎn)T工id="+i);

list.add(emp);

returnlist;

//輸出學(xué)院?jiǎn)T工的信息

publicvoidprintEmployee(){

//獲取到學(xué)院?jiǎn)T工

ListCollegeEmployeelist1=getAllEmployee();

System.out.println("------------學(xué)院?jiǎn)T工------------");

list1.stream().map(CollegeEmployee::getId).forEach(System.out::println);

//學(xué)校管理類

//分析SchoolManager類的直接朋友類有哪些:Employee、CollegeManager

//CollegeEmployee不是直接朋友,而是一個(gè)陌生類,這樣違背了迪米特法則

classSchoolManager{

//返回學(xué)??偛康膯T工

publicListEmployeegetAllEmployee(){

ListEmployeelist=newArrayList();

for(inti=1;ii++){//這里我們?cè)黾恿?個(gè)員工到list

Employeeemp=newEmployee();

emp.setId("學(xué)??偛繂T工id="+i);

list.add(emp);

returnlist;

//該方法完成輸出學(xué)??偛亢蛯W(xué)院?jiǎn)T工信息(id)

voidprintAllEmployee(CollegeManagersub){

//分析問(wèn)題

//改進(jìn)代碼:將輸出學(xué)院的員工方法,封裝到CollegeManager

sub.printEmployee();

//獲取到學(xué)??偛繂T工

ListEmployeelist2=getAllEmployee();

System.out.println("------------學(xué)??偛繂T工------------");

list2.stream().map(Employee::getId).forEach(System.out::println);

publicclassDemeter{

publicstaticvoidmain(String[]args){

System.out.println("~~~使用迪米特法則的改進(jìn)~~~");

//創(chuàng)建了一個(gè)SchoolManager對(duì)象

SchoolManagersch

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論