まず、デメテル
基本的な紹介:
(1)オブジェクトが他のオブジェクトの最小の理解に保たれるべきです
カップリング(2)クラスとクラスの間の密接な関係、より大きな程度
(3)デメテル(デメテルPriciple)、また、その依存クラスのクラスはよく知っていることを少なくとも知ら原則として知られています。つまり、依存クラスは、できるだけ内部ロジックは、クラスの中にカプセル化された方法を複雑に関係なくため。外国の方法は、公開に加えて提供し、任意の情報を漏らすしません
(4)デメテルは、より単純な定義がありますだけで直接友人が通信します
(5)直接の友人:各オブジェクトが他のオブジェクトに結合関係限り、2つのオブジェクト間の結合関係を持っているが、我々は、2つのオブジェクト間の友情を言います。複数の結合モード、依存、関連、結合、重合など、方法の我々はメンバー変数を発生呼び出し、メソッドパラメータ、戻り値が直接友人クラスであり、ローカル変数のクラスのうち、今で直接友人ではありません。言い換えれば、なじみのないクラスが最高のローカル変数の形でクラス内に表示されないように。
意味:クラス間の結合を低減
第二に、ケースプレゼンテーション
シーン:様々な大学や本社に所属する学校は、ありますが、学校は現在、ID本部スタッフと大学のスタッフのIDをプリントアウトするために必要とされています
1.基本的なコードの実装
従業員(学校の本社スタッフ部門)、CollegeEmployee(従業員カテゴリの大学)、CollegeManager(経営の学校、スタッフ管理クラス)、SchoolManager(学校管理):私たちは、次の4つのカテゴリを定義し
; java.util.ArrayListのインポートの インポートjava.util.Listに; / * * * @ClassName:demeter01 * @description: * @author:xiedong * @date:2020年3月21日午後9時17 * / パブリック クラスdemeter01 { 公共 静的 ボイド(文字列[]引数)は、メイン{ //をschoolManagerオブジェクト作成 schoolManager schoolManager = 新しい新しいschoolManagerを(); // 従業員IDと学校本部出力大学従業員情報 schoolManager.printAllEmployee(新しい新しいCollegeManager()); } } // 学校の本部スタッフクラス クラスの従業員{ プライベート文字列ID; 公共 無効SETID(文字列ID){ この .ID = ID; } パブリック文字列のgetId(){ リターンID; } } // スタッフ・カレッジのクラス クラスCollegeEmployee { プライベート文字列ID; 公共 無効SETID(文字列ID) { これ .IDは= 、上記ID上方 } パブリック文字列のgetId(){ 戻り上記ID上記; } } // 管理の学校、スタッフ管理クラス クラスCollegeManager { // 全ての従業員が学校に戻ります 公共の一覧<CollegeEmployee> getAllEmployee(){ 一覧 <CollegeEmployee>一覧= 新しい新しいのArrayList <CollegeEmployee> (); のため(int型 I = 0 ; I < 10 ; I ++){ // 私たちは10人の従業員を追加ここではリストに CollegeEmployee EMP = 新しい新CollegeEmployee(); emp.setId(" INSTITUTE =社員ID " + I); List.add(EMP); } 戻りリスト; } } // 学校の管理クラスの クラスSchoolManager { //戻る学校の本部スタッフへの 公共の一覧<従業員> getAllEmployeeは、()は{ 一覧 <従業員>一覧= 新しい新しいのArrayList <従業員> (); のため(int型私は= 0 ;私は< 5 ; I ++){ // ここでは、5を追加しましたリストへの従業員 の従業員のemp = 新しい新しい従業員(); emp.setId(「学校=上記IDの本社スタッフ」 + I); list.add(EMP); } 戻りリスト; } // このメソッドは、出力学校や大学本部の従業員情報を完了します(ID) ボイドprintAllEmployee(CollegeManagerサブ){ // 大学のスタッフに取得 一覧<CollegeEmployee>のList1 = sub.getAllEmployee(); 。システムOUTの .println(「------------ -----------大学スタッフ- " ); のため(E CollegeEmployee:List1を){ 。システムOUT .println(e.getId()); } // 学校の本部職員の取得 一覧を<従業員> = LIST2 この.getAllEmployee(); 。システムOUTの .println (" ------------学校の本部職員------------ " ); のための(従業員のE:LIST2){ 。システムOUT.println(e.getId())。 } } }
結果を実現:
結果は達成が、我々はSchoolManagerカテゴリを以下のように分析する必要がありますが。
分析:直接の友人SchoolManagerクラス:従業員、CollegeManager;おなじみの友人:CollegeEmployeeこれはデメテルの法則に違反
2、デメテルの改良されたバージョンに基づいて
改善する方法:
直接SchoolManagerの友人で、設計の前に①問題の嘘、CollegeEmployeeクラスがSchoolManagerではありません
②デメテルの法則によると、クラスでこのような間接的なカップリング友情を避ける必要があります表示されます(エクスポートと大学のスタッフのアプローチCollegeManagerパッケージの外部のパブリックメソッドに加えて、任意の情報を漏らさないようにします)
2.1コードの改良版
パブリック クラスdemeter02 { 公共の 静的な 無効メイン(文字列[] args)を{ システム。OUTの .println(「~~~〜デメテル改善を使用して" ); //はSchoolManagerは、オブジェクトを作成します SchoolManager schoolManager = 新しい新しいSchoolManagerを(); // 従業員IDと学校本部出力大学従業員情報 schoolManager.printAllEmployee(新新CollegeManager()); } } // 学校の本部スタッフクラス クラスの従業員{ プライベート文字列ID; 公共 無効SETID(文字列ID){ この .ID = ID; } パブリック文字列のgetId(){ リターンID; } } // スタッフカレッジのクラス クラスCollegeEmployee { プライベート文字列ID; 公共 無効SETID(文字列ID){ この .ID = ID; } パブリック文字列のgetId( ){ リターンID; } } // 学校の従業員管理クラスの クラスCollegeManager { // 返すすべての従業員INSTITUTE 公共一覧<CollegeEmployee> getAllEmployee(){ 一覧<CollegeEmployee>一覧= 新しい新しいのArrayList <CollegeEmployee> (); のため(int型 I = 0 ; I < 10 ; I ++){ // 我々はリストに10人の従業員の追加ここで CollegeEmployee EMP = 新しい新しいCollegeEmployeeを(); emp.setId(" INSTITUTE =スタッフID " + I); List.add(EMP); } 戻りリスト; } パブリック 無効printEmployee(){ // 取得した従業員INSTITUTE 一覧<CollegeEmployee> =のList1 getAllEmployee(); システム。OUTの .println(" ------------学校のスタッフ------------ " ;) のための{:(List1をCollegeEmployee E) 。システムOUT .println(E. getId()); } } } // 学校管理クラスの クラスSchoolManager { // 学校スタッフの本社に復帰 公共一覧<従業員> getAllEmployeeは、(){ 一覧 <従業員>一覧= 新しい新しいのArrayList <従業員> (); のため(int型 I = 0 ; I < 5。 ; I ++){ // ここに私たちは、従業員のリストに追加5 EMP =従業新しい新しい従業員(); emp.setId(「学校=上記IDの本社スタッフ」 + I); list.add(EMP); } 戻りリスト; } // このメソッドは、出力学校や大学本部の従業員情報(ID)を完了します 空printAllEmployee(CollegeManagerサブ){ // 、カプセル化されたCollegeManager研究所を出力する従業員方法 sub.printEmployee(); // 学校の本部職員の取得 一覧を<従業員> = LIST2 この.getAllEmployee(); 。システムOUTの .printlnを(" ------------ ------------学校の本部スタッフ" ); 用{(LIST2従業員E) システム。アウト.println(e.getId()); } } }
次のとおりです。
クラスでこのような間接的なカップリング友情の出現を回避デメテルの法則によります。
第三に、要約
1、デメテルのコアは、クラス間の結合を減少させます
図2に示すように、各クラスが不要な依存を減らすため、従ってのみデメテルは、クラス間の関係(オブジェクト間の)結合減らす必要、依存関係は必要ありませんされていません。