คำจำกัดความ: ห่อหุ้มชุดการโต้ตอบของวัตถุกับวัตถุสื่อกลาง ผู้ไกล่เกลี่ยทำให้แต่ละวัตถุมีปฏิสัมพันธ์โดยไม่มีการแสดงผลดังนั้นจึงคลายการมีเพศสัมพันธ์และเปลี่ยนปฏิสัมพันธ์ระหว่างพวกเขาอย่างอิสระ
ประเภท: รูปแบบคลาสพฤติกรรมแผนภาพคลาส:
โครงสร้างของแบบจำลองตัวกลาง
โหมดตัวกลางเรียกว่าโหมดสื่อกลาง จากแผนภาพคลาสจะแบ่งออกเป็น 3 ส่วน:
บทคัดย่อสื่อกลาง: กำหนดอินเทอร์เฟซระหว่างวัตถุคลาสเพื่อนร่วมงานและวัตถุสื่อกลางและใช้สำหรับการสื่อสารระหว่างเพื่อนร่วมงานแต่ละคน โดยทั่วไปจะมีวิธีการจัดงานนามธรรมหนึ่งหรือหลายวิธีและดำเนินการโดยคลาสย่อย
ระดับการใช้งานตัวกลาง: สืบทอดมาจากผู้ไกล่เกลี่ยนามธรรมและใช้วิธีการเหตุการณ์ที่กำหนดไว้ในสื่อกลางที่เป็นนามธรรม รับข้อความจากชั้นเรียนเพื่อนร่วมงานคนหนึ่งแล้วมีอิทธิพลต่อคลาสอื่น ๆ พร้อมกันผ่านข้อความ
คลาสเพื่อนร่วมงาน: หากวัตถุมีผลต่อวัตถุอื่น ๆ และได้รับผลกระทบจากวัตถุอื่น ๆ วัตถุทั้งสองนี้จะเรียกว่าคลาสเพื่อนร่วมงาน ในไดอะแกรมของชั้นเรียนมีชั้นเรียนเพื่อนร่วมงานเพียงคนเดียวซึ่งเป็นการละเว้นความเป็นจริง ในการใช้งานจริงคลาสเพื่อนร่วมงานมักจะประกอบด้วยหลายอย่างและมีอิทธิพลและพึ่งพาซึ่งกันและกัน ยิ่งเพื่อนร่วมงานมีความสัมพันธ์ที่ซับซ้อนมากขึ้นเท่านั้น ยิ่งไปกว่านั้นคลาสเพื่อนร่วมงานยังสามารถแสดงเป็นชุดของการใช้งานที่สืบทอดคลาสนามธรรมเดียวกัน ในรูปแบบตัวกลางข้อความจะต้องส่งผ่านตัวกลางระหว่างเพื่อนร่วมงาน
ทำไมต้องใช้แบบจำลองตัวกลาง
โดยทั่วไปความสัมพันธ์ระหว่างชั้นเรียนเพื่อนร่วมงานค่อนข้างซับซ้อน เมื่อคลาสเพื่อนร่วมงานหลายคนมีความสัมพันธ์กันความสัมพันธ์ของพวกเขาจะปรากฏเป็นโครงสร้างตาข่ายที่ซับซ้อน นี่เป็นสถาปัตยกรรมที่มากเกินไปนั่นคือมันไม่เอื้อต่อการใช้ซ้ำในชั้นเรียนและไม่มั่นคง ตัวอย่างเช่นในรูปด้านล่างมีวัตถุคล้ายเพื่อนร่วมงานหกชิ้น หากวัตถุ 1 เปลี่ยนแปลงวัตถุ 4 วัตถุจะได้รับผลกระทบ หากวัตถุ 2 เปลี่ยนแปลงวัตถุ 5 ชิ้นจะได้รับผลกระทบ กล่าวอีกนัยหนึ่งการออกแบบความสัมพันธ์โดยตรงระหว่างเพื่อนร่วมงานไม่ดี
หากมีการแนะนำแบบจำลองตัวกลางความสัมพันธ์ระหว่างชั้นเรียนเพื่อนร่วมงานจะกลายเป็นโครงสร้างดาว จากรูปเราจะเห็นได้ว่าการเปลี่ยนแปลงในชั้นเรียนใด ๆ จะส่งผลกระทบต่อชั้นเรียนและตัวกลางเท่านั้นซึ่งจะลดการมีเพศสัมพันธ์ของระบบ การออกแบบที่ดีจะไม่ห่อหุ้มตรรกะการประมวลผลการเชื่อมโยงวัตถุทั้งหมดในชั้นเรียนนี้ แต่จะใช้คลาสพิเศษเพื่อจัดการพฤติกรรมที่ไม่ได้เป็นของคุณ
ตัวอย่าง
ต่อไปนี้เป็นตัวอย่างรหัสเฉพาะ เมื่อเปรียบเทียบกับแผนภาพระดับทั่วไปคลาสนามธรรมบทคัดย่อบทคัดย่อและผู้ไกล่เกลี่ยนามธรรมนามธรรมจะถูกเพิ่มเข้ามา นอกจากนี้ยังมีคลาสเพื่อนร่วมงานสองคนและผู้ไกล่เกลี่ยหนึ่งคน มีความคิดเห็นมากมายในรหัสและไม่ได้รับไดอะแกรมคลาสที่เกี่ยวข้องซึ่งไม่ควรเข้าใจยาก:
เพื่อนร่วมงาน:
// บทคัดย่อเพื่อนร่วมงานคลาส Abstract Class AbstractColleague {Protected Abstract Mediator Mediator; /** เนื่องจากมีคนกลางดังนั้นเพื่อนร่วมงานแต่ละคนจะต้องติดต่อกับคนกลาง*มิฉะนั้นจึงไม่จำเป็นต้องมีอยู่ในระบบนี้ ตัวสร้างที่นี่เทียบเท่ากับการลงทะเบียนตัวกลางกับระบบเพื่อติดต่อ*/ สาธารณะนามธรรม (Mediator Abstractediator) {this.mediator = mediator; } // เพิ่มวิธีการติดต่อกับตัวกลาง (เช่นการลงทะเบียน) ในกลุ่มเพื่อนร่วมงานนามธรรมโมฆะสาธารณะ Setmediator (Abstractediator Mediator) {this.mediator = mediator; }} // เพื่อนร่วมงานที่เฉพาะเจาะจงเพื่อนร่วมชั้นเรียนขยายบทคัดย่อ AbstractColleague {// เพื่อนร่วมงานทุกคนติดต่อผู้ไกล่เกลี่ยผ่านเพื่อนร่วมงานของผู้สร้างระดับแม่ (Abstract Mediator Mediator) } // เพื่อนร่วมงานทุกคนจะต้องมีงานของตัวเองและไม่จำเป็นต้องเกี่ยวข้องกับโมฆะสาธารณะโลกภายนอก () {System.out.println ("เพื่อนร่วมงาน -> ทำภารกิจของคุณเอง ... "); } // เพื่อนร่วมงานทุกคนที่เฉพาะเจาะจงมักจะต้องโต้ตอบกับโลกภายนอกจัดการตรรกะเหล่านี้และจัดงานผ่านโมฆะสาธารณะคนกลาง () {System.out.println ("เพื่อนร่วมงาน-> ขอเพื่อนร่วมงาน B เพื่อทำงานนอกเวลา ... "); super.mediator.execute ("เพื่อนร่วมงาน", "self"); }} // เพื่อนร่วมงานเฉพาะ B เพื่อนร่วมงานระดับเพื่อนร่วมงานขยาย AbstractColleague {Public CollegeB (Mediator Abstract Mediator) {Super (Mediator); } โมฆะสาธารณะ self () {system.out.println ("เพื่อนร่วมงาน b-> ทำงานนอกเวลาของคุณ ... "); } โมฆะสาธารณะ () {system.out.println ("เพื่อนร่วมงาน b-> ขอเพื่อนร่วมงาน A เพื่อทำงานนอกเวลาของเขา ... "); super.mediator.execute ("เพื่อนร่วมงาน", "self"); - หมวดหมู่ตัวกลาง:
// บทคัดย่อตัวกลางบทคัดย่อคลาส AbstractMediator {// ตัวกลางจะต้องรักษาข้อมูลการติดต่อของเพื่อนร่วมงานหลายคนที่ได้รับการปกป้อง Hashtable <String, AbstractColleague> เพื่อนร่วมงาน = new Hashtable <String, AbstractColleague> (); // ตัวกลางสามารถสร้างการติดต่อกับเพื่อนร่วมงานโมฆะสาธารณะ AddColleague (ชื่อสตริง, AbstractColleague C) {this.colleagues.put (ชื่อ, C); } // ตัวกลางยังสามารถยกเลิกการติดต่อกับเพื่อนร่วมงานโมฆะสาธารณะ Deletecolleague (ชื่อสตริง) {this.colleagues.remove (ชื่อ); } // ตัวกลางจะต้องมีการดำเนินการเพื่อจัดการตรรกะกำหนดงานและส่งเสริมการสื่อสารระหว่างเพื่อนร่วมงานโมฆะนามธรรมสาธารณะเรียกใช้งาน (ชื่อสตริง, วิธีการสตริง); } // Mediator คลาสตัวกลางที่เฉพาะเจาะจงขยายบทคัดย่อ {// ฟังก์ชั่นที่สำคัญที่สุดของตัวกลางคือการวิ่งกลับไปมาระหว่างเพื่อนร่วมงานโมฆะสาธารณะเรียกใช้งาน (ชื่อสตริง, วิธีการสตริง) {ถ้า ("self". equals (วิธีการ)) {// แต่ละคนทำหน้าที่ของเขาเอง (เพื่อนร่วมงาน) super.colleagues.get ("เพื่อนร่วมงาน"); เพื่อนร่วมงาน Self (); } else {เพื่อนร่วมงานเพื่อนร่วมงาน = (เพื่อนร่วมงาน) super.colleagues.get ("เพื่อนร่วมงาน"); เพื่อนร่วมงาน Self (); }} else {// วิทยาลัยกับเพื่อนร่วมงานคนอื่น ๆ ถ้า ("เพื่อนร่วมงาน" .Equals (ชื่อ)) {เพื่อนร่วมงานเพื่อนร่วมงาน = (เพื่อนร่วมงาน) super.colleagues.get ("เพื่อนร่วมงาน"); เพื่อนร่วมงาน OUT (); } else {เพื่อนร่วมงานเพื่อนร่วมงาน = (เพื่อนร่วมงาน) super.colleagues.get ("เพื่อนร่วมงาน"); เพื่อนร่วมงาน OUT (); - คลาสทดสอบ:
// ไคลเอนต์คลาสสาธารณะคลาสสาธารณะ {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {// สร้างตัวกลางตัวกลางบทคัดย่อ mediator = mediator ใหม่ (); // สร้างเพื่อนร่วมงานเพื่อนร่วมงานสองคนเพื่อนร่วมงาน = เพื่อนร่วมงานใหม่ (ผู้ไกล่เกลี่ย); เพื่อนร่วมงานเพื่อนร่วมงาน = เพื่อนร่วมงานใหม่ (ผู้ไกล่เกลี่ย); // ตัวกลางสร้างการติดต่อกับเพื่อนร่วมงานแต่ละคน mediator.addcolleague ("เพื่อนร่วมงาน", เพื่อนร่วมงาน); mediator.addcolleague ("เพื่อนร่วมงาน", เพื่อนร่วมงาน); // เพื่อนร่วมงานเริ่มทำงานเพื่อนร่วมงาน Self (); เพื่อนร่วมงาน (); System.out.println ("===================================================================================================================== - - - - - - ผลการทดสอบ:
เพื่อนร่วมงาน A -> ทำหน้าที่ของคุณในหน้าที่ของคุณ ... เพื่อนร่วมงาน A -> ขอให้เพื่อนร่วมงาน B ทำหน้าที่ของคุณในหน้าที่ของคุณ ... เพื่อนร่วมงาน b -> ทำหน้าที่ของคุณในหน้าที่ของคุณ ... ===================================================================== เพื่อนร่วมงาน B -> ทำหน้าที่ของคุณในหน้าที่ของคุณ ... เพื่อนร่วมงาน b -> ขอให้เพื่อนร่วมงาน A ทำหน้าที่ของคุณในหน้าที่ของคุณ ... เพื่อนร่วมงาน A -> ทำหน้าที่ของคุณในหน้าที่ของคุณ ... ====================================================================
แม้ว่าจะมีเพียงสองคลาสเพื่อนร่วมงานที่เฉพาะเจาะจงในรหัสข้างต้นและมีเพียงเพื่อนร่วมงานสองคนเท่านั้นที่ถูกสร้างขึ้นในคลาสทดสอบเราสามารถขยายสิ่งเหล่านี้ได้อย่างเหมาะสมตามวัตถุประสงค์ของแบบจำลองตัวกลางนั่นคือเพิ่มคลาสเพื่อนร่วมงานที่เฉพาะเจาะจง ทำไม เราเห็นว่าตอนนี้มีรหัสการตัดสินที่ยาวนานในวิธีการดำเนินการ () ในคลาส Mediator ด้านบน แม้ว่าจะสามารถย่อยสลายและเพิ่มเข้าไปในวิธีการส่วนตัวอื่น ๆ ในคลาส Mediator แต่ตรรกะทางธุรกิจเฉพาะนั้นขาดไม่ได้
ดังนั้นในขณะที่การแยกการเชื่อมต่อระหว่างเพื่อนร่วมงานตัวกลางเองก็ไม่สอดคล้องกับงานที่เกินความจริงเพราะตรรกะทางธุรกิจเกือบทั้งหมดถูกอธิบายไปยังตัวกลางซึ่งสามารถอธิบายได้ว่าเป็นบทบาทที่ "คาดการณ์ไว้มาก" นี่คือข้อบกพร่องของแบบจำลองตัวกลาง
นอกจากนี้ตัวอย่างรหัสข้างต้นนั้นค่อนข้างเหมาะ บางครั้งเราไม่สามารถแยกความสามัคคีระหว่าง "เพื่อนร่วมงาน" ได้เลยเพื่อสร้างคลาสเพื่อนร่วมงานนามธรรมนามธรรมซึ่งเพิ่มความยากลำบากในการใช้แบบจำลองตัวกลางอย่างมาก
ปรับปรุงใหม่:
เนื่องจากมีข้อบกพร่องในการใช้รหัสข้างต้นของ "สมาคมสองทางที่เปิดเผยในแอพ" ที่เสนอโดย Benjielin อาวุโสตามวิธีการปรับปรุงที่กำหนด 2 ปรับเปลี่ยนรหัสข้างต้นดังนี้:
เพื่อนร่วมงานที่ได้รับการดัดแปลง:
// บทคัดย่อคลาส AbstractColleague {Protected Abstractediator Mediator; // หยุดการสร้างการเชื่อมต่อกับผู้ไกล่เกลี่ยในตัวสร้าง // บทคัดย่อสาธารณะ (Abstract Mediator Mediator) {// this.mediator = mediator; //} // เพิ่มวิธีการไปยังคลาสเพื่อนร่วมงานนามธรรมเพื่อติดต่อผู้ไกล่เกลี่ย (เช่นการลงทะเบียน) โมฆะสาธารณะ setmediator (Abstractediator Mediator) {this.mediator = mediator; }} // เพื่อนร่วมงานเฉพาะเพื่อนร่วมชั้นเรียนขยาย AbstractColleague {// อย่าสร้างการเชื่อมต่อกับผู้ไกล่เกลี่ยในตัวสร้าง // Collegea ของรัฐ (Abstract Mediator Mediator) {// Super (Mediator); //} // เพื่อนร่วมงานทุกคนจะต้องมีส่วนร่วมในส่วนของเขาเองและไม่จำเป็นต้องเกี่ยวข้องกับโมฆะสาธารณะโลกภายนอก () {system.out.println ("เพื่อนร่วมงาน -> ทำส่วนของคุณ ... "); } // เพื่อนร่วมงานทุกคนที่เฉพาะเจาะจงมักจะต้องโต้ตอบกับโลกภายนอกจัดการตรรกะเหล่านี้และจัดงานผ่านโมฆะสาธารณะคนกลาง () {System.out.println ("เพื่อนร่วมงาน -> ขอเพื่อนร่วมงาน B เพื่อทำส่วนหนึ่งของส่วนของเขา ... "); super.mediator.execute ("เพื่อนร่วมงาน", "self"); }} // เพื่อนร่วมงาน B เฉพาะเพื่อนเพื่อนร่วมชั้นเรียนขยาย AbstractColleague {// หยุดการสร้างการเชื่อมต่อกับผู้ไกล่เกลี่ยในตัวสร้าง // เพื่อนร่วมงานสาธารณะ (Mediator Abstract Mediator) {// super (mediator); //} โมฆะสาธารณะ self () {system.out.println ("เพื่อนร่วมงาน -> ทำส่วนของคุณ ... "); } โมฆะสาธารณะ () {system.out.println ("เพื่อนร่วมงาน -> ขอให้เพื่อนร่วมงาน A เพื่อทำส่วนของคุณ ... "); super.mediator.execute ("เพื่อนร่วมงาน", "self"); -
ตัวกลางดัดแปลง:
// บทคัดย่อตัวกลางบทคัดย่อคลาส AbstractMediator {// ตัวกลางจะต้องรักษาข้อมูลการติดต่อของเพื่อนร่วมงานหลายคนที่ได้รับการปกป้อง Hashtable <String, AbstractColleague> เพื่อนร่วมงาน = new Hashtable <String, AbstractColleague> (); // ตัวกลางสามารถสร้างการติดต่อกับเพื่อนร่วมงานโมฆะสาธารณะ AddColleague (ชื่อสตริง, AbstractColleague C) {// ช่วยเหลือเพื่อนร่วมงานเฉพาะสร้างผู้ติดต่อจากตัวกลาง C.SetMediator (นี้); this.colleagues.put (ชื่อ, c); } // ตัวกลางยังสามารถเพิกถอนการติดต่อกับเพื่อนร่วมงานโมฆะสาธารณะ deletecolleague (ชื่อสตริง) {this.colleagues.remove (ชื่อ); } // ตัวกลางจะต้องมีการดำเนินการเพื่อจัดการตรรกะกำหนดงานและส่งเสริมการสื่อสารระหว่างเพื่อนร่วมงานโมฆะนามธรรมสาธารณะเรียกใช้งาน (ชื่อสตริง, วิธีการสตริง); } // ไคลเอ็นต์ระดับการทดสอบระดับสาธารณะ {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {// สร้างตัวกลางตัวกลางนามธรรมที่เป็นสื่อกลาง mediator = mediator ใหม่ (); // ตัวสร้างถูกใช้เพื่อลงทะเบียนตัวกลางสำหรับเพื่อนร่วมงานที่เฉพาะเจาะจงเพื่อติดต่อ // เพื่อนร่วมงานเพื่อนร่วมงาน = เพื่อนร่วมงานใหม่ (ผู้ไกล่เกลี่ย); // เพื่อนร่วมงานเพื่อนร่วมงาน = เพื่อนร่วมงานใหม่ (ผู้ไกล่เกลี่ย); เพื่อนร่วมงานเพื่อนร่วมงาน = เพื่อนร่วมงานใหม่ (); เพื่อนร่วมงานเพื่อนร่วมงาน = เพื่อนร่วมงานใหม่ (); // ตัวกลางสร้างการติดต่อกับเพื่อนร่วมงานแต่ละคน mediator.addcolleague ("เพื่อนร่วมงาน", เพื่อนร่วมงาน); mediator.addcolleague ("เพื่อนร่วมงาน", เพื่อนร่วมงาน); // เพื่อนร่วมงานเริ่มทำงานเพื่อนร่วมงาน Self (); เพื่อนร่วมงาน (); System.out.println ("================================================== - - - - - - -ผลลัพธ์หลังจากการทดสอบจะเหมือนกับก่อนการดัดแปลง