




版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030兒童財(cái)商培養(yǎng)產(chǎn)品形態(tài)演變與發(fā)達(dá)國(guó)家經(jīng)驗(yàn)借鑒
- 2025-2030兒童認(rèn)知功能醫(yī)學(xué)增強(qiáng)方法與應(yīng)用趨勢(shì)
- 2025-2030兒童維生素D缺乏篩查技術(shù)與預(yù)防保健體系構(gòu)建
- 2025-2030兒童社會(huì)認(rèn)知能力發(fā)展的神經(jīng)遞質(zhì)變化規(guī)律
- 2025-2030兒童沙盤游戲治療師專業(yè)認(rèn)證體系的市場(chǎng)需求
- 2025-2030兒童數(shù)學(xué)能力發(fā)展的關(guān)鍵腦區(qū)功能連接特征分析
- 2025-2030兒童戲劇教育心理效益與市場(chǎng)培育路徑探索
- 2025-2030兒童味覺(jué)發(fā)育與情緒調(diào)節(jié)的神經(jīng)關(guān)聯(lián)研究及健康食品開(kāi)發(fā)
- 2025-2030兒童創(chuàng)傷后認(rèn)知功能障礙干預(yù)市場(chǎng)未被滿足需求
- 2025-2030健身鏡交互技術(shù)迭代與家庭健身場(chǎng)景重構(gòu)趨勢(shì)報(bào)告
- 足浴前臺(tái)禮儀培訓(xùn)課件
- 村級(jí)財(cái)務(wù)業(yè)務(wù)知識(shí)培訓(xùn)課件
- 2025年幼兒園中、高級(jí)教師職稱考試(綜合素質(zhì))歷年參考題庫(kù)含答案詳解(5卷)
- 美術(shù)基礎(chǔ) 課件全套 第1-5章 美術(shù)簡(jiǎn)介 -中國(guó)民間美術(shù)
- 2024人教版七年級(jí)生物下冊(cè)期末復(fù)習(xí)全冊(cè)考點(diǎn)背誦提綱
- 生物力學(xué)正畸方案優(yōu)化-洞察及研究
- 《中職工程測(cè)量技術(shù)專業(yè)《GNSS測(cè)量技術(shù)與應(yīng)用》課程標(biāo)準(zhǔn)》
- 公安部門大數(shù)據(jù)管理辦法
- 污廢水減污降碳協(xié)同評(píng)估指南
- 2025年上海市(秋季)高考語(yǔ)文真題詳解
- 水廠培訓(xùn)課件
評(píng)論
0/150
提交評(píng)論