คำจำกัดความคอมโพสิต: จัดระเบียบวัตถุในโครงสร้างต้นไม้เพื่อให้ได้ลำดับชั้น "พทั้งหมดทั้งหมด" เพื่อให้ลูกค้ามีการใช้วัตถุแต่ละชิ้นและวัตถุรวมกันอย่างสม่ำเสมอ
คอมโพสิตนั้นง่ายต่อการเข้าใจ วัตถุเหล่านี้ในตัวองค์ประกอบมีอินเทอร์เฟซทั่วไป มันสามารถอธิบายได้ว่าเป็นการดึงหนึ่งร้อยเคลื่อนไหว
ดังนั้นโหมดคอมโพสิตจึงใช้โหมดตัววนซ้ำซึ่งคล้ายกับโหมดความรับผิดชอบ
ผลประโยชน์คอมโพสิต:
1. ทำให้การโทรของลูกค้าง่ายขึ้นและลูกค้าสามารถใช้โครงสร้างการรวมกันหรือวัตถุเดียวในลักษณะที่สอดคล้องกัน รหัส.
2. ง่ายกว่าที่จะเพิ่มชิ้นส่วนวัตถุลงในตัวรวมกัน ไคลเอนต์ไม่จำเป็นต้องเปลี่ยนรหัสเนื่องจากได้เพิ่มองค์ประกอบวัตถุใหม่
วิธีใช้คอมโพสิต
ขั้นแรกให้กำหนดอินเทอร์เฟซหรือคลาสนามธรรมนี่เป็นวิธีการออกแบบทั่วไป การจัดการองค์ประกอบคอมโพสิต
รหัสต่อไปนี้ถูกกำหนดให้เป็นคลาสนามธรรมและโดยทั่วไปพยายามใช้อินเทอร์เฟซให้มากที่สุด
การคัดลอกรหัสมีดังนี้:
อุปกรณ์ระดับนามธรรมสาธารณะ {
ชื่อสตริงส่วนตัว;
// ราคาอินเทอร์เน็ต
นามธรรมสาธารณะ Double Netprice ();
// ราคาส่วนลด
บทคัดย่อสาธารณะส่วนลดคู่ ();
// เพิ่มวิธีการชิ้นส่วน
บูลีนสาธารณะเพิ่ม (อุปกรณ์อุปกรณ์) {return false;
// ลบเมธอดชิ้นส่วน
บูลีนสาธารณะลบ (อุปกรณ์อุปกรณ์) {return false;
// หมายเหตุที่นี่นี่คือวิธีการเข้าถึงคลาสส่วนประกอบ
Iterator Public Iter () {return null;
อุปกรณ์สาธารณะ (ชื่อสตริงสุดท้าย) {this.name = name;}
-
อุปกรณ์ระดับนามธรรมคือคำจำกัดความของส่วนประกอบแทนวัตถุของคลาสคอมโพสิตและวิธีการทั่วไปหลายวิธีถูกกำหนดไว้ในอุปกรณ์
การคัดลอกรหัสมีดังนี้:
ดิสก์ระดับสาธารณะขยายอุปกรณ์ {
ดิสก์สาธารณะ (ชื่อสตริง) {super (ชื่อ);
// กำหนดราคาเครือข่ายดิสก์เป็น 1
Public Double NetPrice () {return 1.;
// กำหนดราคาส่วนลดดิสก์ลดลง 0.5%
Public Discount Price () {return .5;
-
ดิสก์เป็นวัตถุหรือส่วนประกอบในตัวรวมกันซึ่งเป็นองค์ประกอบเดียว (ดั้งเดิม)
ความเป็นไปได้อีกอย่างหนึ่งคือองค์ประกอบคือการรวมกันนั่นคือมี 'ลูกชาย' ภายใต้องค์ประกอบนี้ ตอนนี้เราต้องกำหนดชุดค่าผสมนี้:
การคัดลอกรหัสมีดังนี้:
บทคัดย่อคลาส CompositeeQuipment ขยายอุปกรณ์ {
ส่วนตัว int i = 0;
// กำหนดเวกเตอร์เพื่อจัดเก็บ 'ลูกชาย'
อุปกรณ์ LSIT ส่วนตัว = new ArrayList ();
Public Compositeequipment (ชื่อสตริง) {super (ชื่อ);
เพิ่มบูลีนสาธารณะ (อุปกรณ์อุปกรณ์) {
this.equipment.add (อุปกรณ์);
กลับมาจริง;
-
Public Double NetPrice () {
double netprice = 0;
ตัววนซ้ำ iter = equipment.iterator ();
สำหรับ (iter.hasnext ())
netPrice+= ((อุปกรณ์) iter.next ()). netprice ();
ส่งคืน netprice;
-
Public Double DiscountPrice () {
ส่วนลดสองครั้ง = 0;
ตัววนซ้ำ iter = equipment.iterator ();
สำหรับ (iter.hasnext ())
ส่วนลดราคา+= ((อุปกรณ์) iter.next ()). ส่วนลดราคา ();
ส่งคืนราคาลดราคา;
-
// หมายเหตุที่นี่นี่คือวิธีการเข้าถึงส่วนประกอบในชุดค่าผสมของคุณเอง
// เหตุผลที่ไม่มีดิสก์ด้านบนมีอยู่เพราะดิสก์เป็นองค์ประกอบเดียว
Public Iterator iter () {
return equipment.iterator ();
-
// overload วิธี iterator
Public Boolean Hasnext () {return i <equipment.size ();
// overload วิธี iterator
วัตถุสาธารณะถัดไป () {
ถ้า (hasnext ())
return equipment.elementat (i ++);
อื่น
โยน nosuchelementexception ใหม่ ();
-
-
CompositeeQuipment ด้านบนสืบทอดอุปกรณ์และให้วิธีการเข้าถึงภายนอกสำหรับวัตถุภายในตัววนซ้ำมากเกินไป
ลองดูที่ Compositeequipment สองประเภท: แชสซีบ็อกซ์ดิสก์และตู้กล่อง กล่องเช่นฮาร์ดดิสก์ฟลอปปี้ไดรฟ์ ฯลฯ ไม่ต้องสงสัยเลยว่าทั้งสองอย่างนี้มีการรวมกัน
การคัดลอกรหัสมีดังนี้:
แชสซีระดับสาธารณะขยาย CompositeeQuipment {
แชสซีสาธารณะ (ชื่อสตริง) {super (ชื่อ);
public double netprice () {return 1.+super.netprice ();
Public Discount Price () {return .5+super.discountPrice ();
-
คณะรัฐมนตรีชั้นเรียนสาธารณะขยาย CompositeeQuipment {
คณะรัฐมนตรีสาธารณะ (ชื่อสตริง) {super (ชื่อ);
public double netprice () {return 1.+super.netprice ();
Public Discount Price () {return .5+super.discountPrice ();
-
จนถึงตอนนี้เราได้เสร็จสิ้นสถาปัตยกรรมของโมเดลคอมโพสิตทั้งหมด
เราสามารถดูรหัสของไคลเอนต์การโทร Compose:
การคัดลอกรหัสมีดังนี้:
ตู้เก็บของ = ตู้ใหม่ ("หอคอย");
แชสซีแชสซี = แชสซีใหม่ ("แชสซีพีซี");
// แทรกแชสซีพีซีลงในหอคอย (แพ็คดิสก์ลงในกล่อง)
cabinet.add (แชสซี);
// แทรกฮาร์ดไดรฟ์ 10GB ไปยังแชสซีพีซี (ติดตั้งฮาร์ดไดรฟ์ลงในกล่องดิสก์)
Chassis.add (ดิสก์ใหม่ ("10 GB"));
// การเรียกวิธี NetPrice ();
System.out.println ("netPrice ="+cabinet.netPrice ());
System.out.println ("ส่วนลด ="+cabinet.discountPrice ());
วิธีการที่เรียกว่าข้างต้นคือ netprice () หรือส่วนลดราคา ()
คอมโพสิตเป็นแบบจำลองที่ฉลาดมากที่รวบรวมภูมิปัญญา
การใช้ฟอรัมเป็นตัวอย่างมีโพสต์ (ข้อความ) จำนวนมากในเวอร์ชัน (ฟอรัม) ดังนั้นเราจึงเข้าสู่ Jive ลองดูว่ามันถูกนำไปใช้อย่างไร
กายวิภาคศาสตร์ Jive
ใน Jive Forumthread เป็นคอนเทนเนอร์คอนเทนเนอร์ (ชุดค่าผสม) ของ Forummessages กล่าวคือ Forumthread คล้ายกับ Compositeequipment ในตัวอย่างก่อนหน้าของเรา
การคัดลอกรหัสมีดังนี้:
[ด้าย]
|- [ข้อความ]
|- [ข้อความ]
|- [ข้อความ]
|- [ข้อความ]
|- [ข้อความ]
เราเห็นรหัสต่อไปนี้ใน ForumThread:
การคัดลอกรหัสมีดังนี้:
อินเทอร์เฟซสาธารณะ ForumThread {
-
Public Void AddMessage (Forummessage ParentMessage, Forummessage NewMessage)
โยนโดยไม่ได้รับอนุญาต;
โมฆะสาธารณะ deleTemessage (ข้อความ forummessage)
โยนโดยไม่ได้รับอนุญาต;
ข้อความตัววนซ้ำสาธารณะ ();
-
-
เช่นเดียวกับ Compositeequipment มันมีวิธีการเข้าถึงส่วนประกอบในตัวผสมของคุณเอง: การเพิ่มการลบและการสำรวจ
จากการวิเคราะห์ Jive ของฉันในรุ่นอื่น ๆ เราได้เข้าใจกรอบของระบบ Jive Forum .