ตัวอย่างนี้อธิบายถึงการใช้โหมดการรวมกันเพื่อใช้งานฟังก์ชั่นของการแสดงโครงสร้างองค์กรของ บริษัท แบ่งปันสำหรับการอ้างอิงของคุณดังนี้:
1. คำจำกัดความรูปแบบ
โหมดการรวมกัน: การรวมวัตถุเข้ากับโครงสร้างต้นไม้เพื่อแสดงลำดับชั้น "ทั้งหมด" บางส่วน โหมดการรวมกันทำให้ผู้ใช้สอดคล้องกับการใช้วัตถุแต่ละชิ้นและวัตถุรวม
2. ตัวอย่างของโหมดการรวมกัน
1 การวิเคราะห์รูปแบบ
เรายืมแผนภูมิองค์กรของ บริษัท เพื่อแสดงรูปแบบนี้
หลังจากการวิเคราะห์เราได้รับแผนภาพระดับคงที่ของรูปแบบนี้ดังนี้:
2 ตัวอย่างรหัส
2.1 สร้างชั้นเรียนนามธรรมของพนักงาน
แพ็คเกจ com.demo.composite;/** * อินเตอร์เฟสคลาสพนักงาน * * @author * */พนักงานระดับนามธรรมสาธารณะ {// หมายเลขพนักงานที่ได้รับการป้องกันสตริงหมายเลข; // ชื่อพนักงานชื่อสตริงป้องกัน; // ตำแหน่งที่ป้องกันตำแหน่งสตริง; // เงินเดือนที่ได้รับการป้องกันเงินเดือน // ความยาวคุณสมบัติส่วนตัวสตริงความยาว int ส่วนตัว; // วิธีการสร้างเจ้าหน้าที่สาธารณะ (หมายเลขสตริง, ชื่อสตริง, ตำแหน่งสตริง, เงินเดือนลอย) {this.no = no; this.name = ชื่อ; this.position = ตำแหน่ง; this.salary = เงินเดือน; // คำนวณความยาวไบต์ทั้งหมด this.length += (no == null || "" .equals (No.Trim ()))? 0: No.getBytes (). ความยาว; this.length += (name == null || "" .equals (name.trim ()))? 0: ชื่อ. getBytes (). ความยาว; this.length += (ตำแหน่ง == null || "" .equals (position.trim ()))? 0: position.getBytes (). ความยาว; this.length += string.valueof (เงินเดือน) .getBytes (). ความยาว; } // รับข้อมูลผู้ใช้พื้นฐานโมฆะสาธารณะ PrintUserBaseInfo () {System.out.println ("|" + this.no + "" + this.name + "" + this.position + "" this.salary); } // เพิ่มข้อมูลพนักงานเป็นโมฆะนามธรรมสาธารณะเพิ่ม (พนักงานพนักงาน); // ลบพนักงานนามธรรมสาธารณะพนักงานลบ (หมายเลขสตริง); // พิมพ์ข้อมูลพนักงานเป็นโมฆะสาธารณะบทคัดย่อ printemployeEsInfo (เลเยอร์ int); // พิมพ์อักขระหลายตัวป้องกันโมฆะ printchar (เลเยอร์ int) {สำหรับ (int j = 0; j <layer * 2; j ++) {system.out.print ("-"); }} // วิธีการส่วนตัวพิมพ์โมฆะ protline () {system.out.print ("+"); สำหรับ (int i = 0; i <this.length+4; i ++) {system.out.print ("-"); } system.out.println ("-"); } สตริงสาธารณะ getNo () {return no; } โมฆะสาธารณะ setno (หมายเลขสตริง) {this.no = no; } สตริงสาธารณะ getName () {ชื่อคืน; } โมฆะสาธารณะ setName (ชื่อสตริง) {this.name = name; } การ getPosition สตริงสาธารณะ () {ตำแหน่งส่งคืน; } โมฆะสาธารณะ setPosition (ตำแหน่งสตริง) {this.position = ตำแหน่ง; } สาธารณะลอยตัว Getalary () {คืนเงินเดือน; } โมฆะสาธารณะ setSalary (เงินเดือนลอย) {this.salary = เงินเดือน; -2.2 สร้างผู้จัดการ
แพ็คเกจ com.demo.composite.sub; นำเข้า java.util.arraylist; นำเข้า com.demo.composite.staff;/** * ผู้จัดการ (คนที่มีพนักงานคนอื่น ๆ ภายใต้คำสั่งของเขา) * * @author */ผู้จัดการชั้นเรียนสาธารณะ // สร้างวิธีการผู้จัดการสาธารณะ (หมายเลขสตริง, ชื่อสตริง, ตำแหน่งสตริง, เงินเดือนลอย) {super (ไม่, ชื่อ, ตำแหน่ง, เงินเดือน); } / *** เพิ่มพนักงาน* / @Override โมฆะสาธารณะเพิ่ม (พนักงาน) {this.arraylist.add (พนักงาน); } / *** ลบข้อมูลพนักงาน* / @Override เจ้าหน้าที่สาธารณะลบ (หมายเลขสตริง) {พนักงานพนักงาน = null; if (ไม่! = null &&! "". Equals (No.Trim ())) {สำหรับ (int i = 0; i <this.arraylist.size (); i ++) {ถ้า (this.arraylist.get (i) == null) {ดำเนินการต่อ; } if (no.equals (this.arraylist.get (i) .getNo ())) {พนักงาน = this.arraylist.remove (i); หยุดพัก; }}} พนักงานส่งคืน; } / *** พิมพ์ข้อมูลพนักงาน* / @Override โมฆะสาธารณะ printemployeEsInfo (เลเยอร์ int) {int tmplayer = ++ เลเยอร์; สำหรับ (int i = 0; i <this.arraylist.size (); i ++) {ถ้า (this.arraylist.get (i) == null) {ดำเนินการต่อ; } // print '-' printchar (tmplayer); // พิมพ์ข้อมูลพนักงานพื้นฐาน this.arraylist.get (i) .printuserbaseinfo (); // พิมพ์ข้อมูลพนักงานภายใต้โพสต์ของคุณ this.arraylist.get (i) .printemployeEsInfo (tmplayer); -2.3 สร้างพนักงานธรรมดา
แพ็คเกจ com.demo.composite.sub; นำเข้า com.demo.composite.staff;/** * พนักงานสามัญ (ทำงานจริง) * * @author * */พนักงานชั้นเรียนสาธารณะขยายพนักงาน {// วิธีการสร้างพนักงานสาธารณะ } / *** เพิ่มข้อมูลพนักงาน* / @Override โมฆะสาธารณะเพิ่ม (พนักงาน) {return; } / *** ลบข้อมูลพนักงาน* / @Override เจ้าหน้าที่สาธารณะลบ (หมายเลขสตริง) {// ส่งคืนค่า null ส่งคืนค่า null โดยตรง; } / *** พิมพ์ข้อมูลพนักงาน* / @Override โมฆะสาธารณะ printemployeEsInfo (เลเยอร์ int) {return; -2.4 การทดสอบลูกค้า
แพ็คเกจ com.demo; นำเข้า com.demo.composite.staff; นำเข้า com.demo.composite.sub.employees; นำเข้า com.demo.composite.sub.Manager;/** * แอปพลิเคชันหลัก * * @author * */ลูกค้าชั้นเรียน "บิ๊กบอส", "ซีอีโอ", 100000); / *** CEO มีผู้จัดการแผนกหลายคน* // // ผู้จัดการฝ่ายการเงินพนักงานฝ่ายการเงิน = ผู้จัดการคนใหม่ ("11", "ประธานาธิบดีจาง", "ผู้จัดการแผนกการเงิน", 60000); // ผู้จัดการพนักงานพนักงาน = ผู้จัดการคนใหม่ ("12", "ประธานาธิบดีวัง", "ผู้จัดการประธานาธิบดี", 60000); // Staff TechnicalManager = ผู้จัดการคนใหม่ ("13", "ประธานาธิบดีเฉิน", "ผู้จัดการฝ่ายเทคนิค", 60000); / *** นอกจากนี้ยังมีผู้ช่วยและหัวหน้างานหลายคนในแผนกเทคนิค* // // เจ้าหน้าที่ผู้จัดสรร = ผู้จัดการคนใหม่ ("1301", "ผู้ช่วยวัง", "ผู้ช่วยแผนก", 20000); // แผนกเทคนิคผู้จัดการ 1 พนักงาน DeptManager1 = ผู้จัดการคนใหม่ ("1302", "Supervisor1", "หัวหน้างานด้านเทคนิค", 30000); / ** * หัวหน้างานด้านเทคนิค DeptManager1 มีวิศวกรซอฟต์แวร์ (บุคคลที่ทำงานในที่สุด) */ พนักงานซอฟต์แวร์ Enhineerer1 = พนักงานใหม่ ("1302001", "Zhang San", "วิศวกรซอฟต์แวร์", 5000); STAFF SoftwareEngineer2 = พนักงานใหม่ ("1302002", "Li Si", "Software Engineer", 5500); STAFF SoftwareEngineer3 = พนักงานใหม่ ("1302003", "Wang Wu", "Software Engineer", 4500); // เพิ่มข้อมูลพนักงานสำหรับผู้อำนวยการด้านเทคนิค 1 DeptManager1.add (SoftwareEngineer1); DeptManager1.add (SoftwareEngineer2); DeptManager1.add (SoftwareEngineer3); // ผู้อำนวยการฝ่ายเทคนิค 2 พนักงาน DeptManager2 = ผู้จัดการคนใหม่ ("1303", "Supervisor2", "ผู้อำนวยการด้านเทคนิค", 30000); // เพิ่มไปยังผู้จัดการฝ่ายเทคนิค: ผู้ช่วยแผนกผู้อำนวยการด้านเทคนิค 1 และผู้อำนวยการด้านเทคนิค 2 TechnicalManager.add (Deptassistant); TechnicalManager.add (DeptManager1); TechnicalManager.add (DeptManager2); // ผู้จัดการฝ่ายการตลาดการตลาด MARKSITMANAGER = ผู้จัดการคนใหม่ ("14", "Mr. Wu", "ผู้จัดการตลาด", 60000); // เพิ่มลงใน CEO: ผู้จัดการแผนกการเงินผู้จัดการฝ่ายทรัพยากรบุคคลผู้จัดการแผนกเทคนิคและผู้จัดการฝ่ายการตลาด Boss.Add (FinancyManager); BOSS.ADD (PersonnelManager); BOSS.ADD (TechnicalManager); BOSS.ADD (MarketingManager); // พิมพ์ข้อมูล CEO Boss.printuserbaseinfo (); // พิมพ์ข้อมูลพนักงาน CEO Boss.printemployeEsInfo (1); -ผลการดำเนินการมีดังนี้:
| 1 บิ๊กบอสซีอีโอ 100000.0
--- | 11 นายพลจางการเงินแผนกผู้จัดการ 60000.0
--- | 12 ทั่วไป Wang Human Resources Manager 60000.0
--- | 13 ผู้จัดการฝ่ายเทคนิคทั่วไปเฉิน 60000.0
------ | 1301 ผู้ช่วยแผนก Wang ผู้ช่วย 20000.0
----- | 1302 หัวหน้างาน 1 หัวหน้างานด้านเทคนิค 30000.0
------- | 1302001 Zhang SAN Software Engineer 5000.0
------- | 1302002 Li Si Software Engineer 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 ของทุกคน