この例では、企業の組織構造を表す機能を実装するための組み合わせモードの使用について説明します。次のように、参照のために共有してください。
1。パターン定義
組み合わせモード:オブジェクトをツリー構造に組み合わせて、「部分的に」階層を表します。コンビネーションモードにより、ユーザーは個々のオブジェクトと組み合わせオブジェクトの使用と一致します。
2。組み合わせモードの例
1パターン分析
このモデルを説明するために、会社の組織チャートを借りています。
分析後、次のようにこのパターンの静的クラス図を取得します。
2つのコードの例
2.1従業員の抽象クラスを確立します
パッケージcom.demo.composite;/** *従業員クラスインターフェイス * * @author * */public抽象クラススタッフ{//従業員番号保護された文字列番号; //従業員名保護された文字列名。 //保護された文字列位置の位置。 //給与保護されたフロート給与。 //プライベートプロパティの長さの文字列プライベートインター。 //構築方法パブリックスタッフ(文字列番号、文字列名、文字列位置、フロート給与){this.no = no; this.name = name; this.position = position; this.salary = salary; //合計バイトの長さthis.length +=(no == null || "" .equals(no.trim()))? 0:no.getBytes()。長さ; this.length +=(name == null || "" .equals(name.trim())? 0:name .getBytes()。長さ; this.length +=(position == null || "" .equals(position.trim())? 0:position.getBytes()。長さ; this.length += string.valueof(salary).getBytes()。length; } //基本的なユーザー情報を取得しますprintuserbaseinfo(){system.out.println( "|" + this.no + "" + this.name + "" + this.position + "" + this.Salary); } //従業員情報の追加パブリックアブストラクトvoid add(スタッフスタッフ); //従業員のパブリック抽象スタッフを削除する(文字列番号); //従業員情報を印刷して、パブリックアブストラクトvoid printemployeesinfo(int layer); //いくつかの文字を印刷保護されたvoid printchar(int layer){for(int j = 0; j <layer * 2; j ++){system.out.print( " - "); }} //プライベートメソッドは、ライン保護されたvoid printline(){system.out.print( "+"); for(int i = 0; i <this.length+4; i ++){system.out.print( " - "); } system.out.println( " - "); } public string getno(){return no; } public void setno(string no){this.no = no; } public string getname(){return name; } public void setName(string name){this.name = name; } public string getPosition(){return position; } public void setposition(string position){this.position = position; } public float getSalary(){return Salary; } public void setSalary(float Salary){this.salary = salary; }}2.2マネージャーを作成します
パッケージcom.demo.composite.sub; import java.util.arraylist; import com.demo.composite.staff;/** * Manager(彼の指揮下にある他の従業員のいる人) * * @author * */public class Manager {//従業員に関する情報の保存プライベート最終配列//構築方法パブリックマネージャー(文字列番号、文字列名、文字列位、フロート給与){super(no、name、position、salary); } / ***従業員を追加* / @Override public void add(スタッフスタッフ){this.arraylist.add(stuff); } / ***従業員情報を削除* / @Overrideパブリックスタッフremove(string no){スタッフスタッフ= null; if(no!= null &&! ""。equals(no.trim())){for(int i = 0; i <this.arraylist.size(); i ++){if(this.arraylist.get(i)== null){続行; } if(no.equals(this.arraylist.get(i).getno())){stuff = this.arraylist.remove(i);壊す; }}}スタッフを返します。 } / ***従業員情報を印刷* / @Override public void printemployeSinfo(int layer){int tmplayer = ++ layer; for(int i = 0; i <this.arraylist.size(); i ++){if(this.arraylist.get(i)== null){continue; } // print ' - ' printchar(tmplayer); //基本的な従業員情報this.arraylist.get(i).printuserbaseinfo(); //掲載の下に従業員情報を印刷します。 }}}2.3普通の従業員を作成します
パッケージcom.demo.composite.sub; Import com.demo.composite.staff;/** *普通の従業員(本当に働いている) * * @author * * */public class Employees experns Staff {// Construction Method Public Employees(String No、String Name、String Position、Float Salary) } / ***従業員情報の追加* / @Override public void add(スタッフスタッフ){return; } / ***従業員情報を削除* / @Overrideパブリックスタッフremove(string no){// nullを直接返すnull; } / ***従業員情報を印刷* / @Override public void printemployeSinfo(int layer){return; }}2.4クライアントテスト
パッケージcom.demo; import com.demo.composite.staff;インポートcom.demo.composite.sub.employees; Import com.demo.composite.sub.manager;/** * mainアプリケーション * * */パブリッククラスクライアント{/** * @param args */public void = big mander( "bigs [] bigs"/"ボス」、「CEO」、100000); / *** CEOには複数の部門マネージャーがいます*/ //財務部門マネージャースタッフファイナンスマネーガー=新しいマネージャー( "11"、 "Zhang"、 "Financial Department Manager"、60000); //スタッフ担当マネージャー=新しいマネージャー( "12"、「大統領王」、「社長マネージャー」、60000); //スタッフTechnicalManager = new Manager( "13"、 "President Chen"、 "Technical Department Manager"、60000); / ***技術部門にはアシスタントと数人の監督者もいます*/ //スタッフDeptassistant = new Manager( "1301"、 "Assistant Wang"、 "Department Assistant"、20000); // Technical Department Manager1スタッフDeptmanager1 = new Manager( "1302"、 "Supervisor1"、 "Technical Supervisor"、30000); / ** *テクニカルスーパーバイザーDeptmanager1ソフトウェアエンジニア(最終的に働く人) */ Staff SoftwareEngineer1 =新しい従業員( "1302001"、 "Zhang San"、 "Software Engineer"、5000);スタッフSoftwareEngineer2 =新しい従業員( "1302002"、 "li si"、 "ソフトウェアエンジニア"、5500);スタッフSoftwareEngineer3 =新しい従業員( "1302003"、 "Wang Wu"、 "Software Engineer"、4500); //テクニカルディレクター1 Deptmanager1.Add(SoftwareEngineer1)に従業員情報を追加します。 deptmanager1.add(softwareengineer2); deptmanager1.add(softwareengineer3); //技術部門ディレクター2スタッフDeptmanager2 = new Manager( "1303"、 "Supervisor2"、 "Technical Director"、30000); //技術部門マネージャーに追加:部門アシスタント、テクニカルディレクター1、およびテクニカルディレクター2 TechnicalManager.Add(Deptassistant); TechnicalManager.Add(deptmanager1); TechnicalManager.Add(deptmanager2); //マーケティングマネージャースタッフMarketingManager = new Manager( "14"、 "Mr. Wu"、 "Market Manager"、60000); // CEOに追加:財務部門マネージャー、人事部門マネージャー、技術部門マネージャー、マーケティングマネージャーBoss.Add(FinanceManager); boss.add(personthermanager); Boss.Add(TechnicalManager); Boss.Add(MarketingManager); // CEO情報BOSS.PRINTUSERBASEINFO()を印刷します。 // CEOの従業員情報BOSS.PRINTEMPLOYESEESINFO(1)を印刷します。 }}操作結果は次のとおりです。
| 1ビッグボスCEO 100000.0
--- | 11 Zhang Finance Department Manager 60000.0
--- | 12一般的な人事部マネージャー60000.0
--- | 13一般チェン技術部門マネージャー60000.0
------ | 1301アシスタントワン部門アシスタント20000.0
----- | 1302スーパーバイザー1テクニカルスーパーバイザー30000.0
------- | 1302001 Zhang Sanソフトウェアエンジニア5000.0
------- | 1302002 Li Siソフトウェアエンジニア5500.0
------- | 1302003 Wang Wu Software Engineer 4500.0
------ | 1303スーパーバイザー2テクニカルスーパーバイザー30000.0
--- | 14ゼネラルマネージャーWUマーケティング部門60000.0
3。このモデルの設計原則
1個々のオブジェクトと組み合わせのオブジェクトを均一に扱います
2要約指向プログラミング
4.機会を使用します
1オブジェクトの「部分的および全体の」階層を表現したい場合。
2ユーザーが組み合わせたオブジェクトと単一のオブジェクトの違いを無視したい場合、ユーザーは結合された構造内のすべてのオブジェクトを均一に使用します。
コンビネーションモードの静的クラス図は次のとおりです
Javaアルゴリズムの詳細については、このサイトに興味のある読者は、「Javaデータ構造とアルゴリズムのチュートリアル」、「Java操作DOMノードのヒントの要約」、「Javaファイルの要約およびディレクトリ操作のヒント」、「Java Cache操作のヒントの要約」というトピックを見ることができます。
この記事がみんなのJavaプログラミングに役立つことを願っています。