หนังสือของ Dr. Yan Hong เรื่อง "JAVA and Patterns" เริ่มต้นด้วยคำอธิบายของรูปแบบ Mediator:
รูปแบบผู้ไกล่เกลี่ยคือรูปแบบพฤติกรรมของวัตถุ รูปแบบตัวกลางสรุปวิธีที่ชุดของวัตถุโต้ตอบกัน เพื่อที่จะได้ไม่ต้องอ้างอิงถึงกันอย่างชัดเจน ซึ่งจะทำให้สามารถเชื่อมต่อกันได้อย่างหลวมๆ เมื่อการโต้ตอบระหว่างวัตถุเหล่านี้บางส่วนเปลี่ยนไป จะไม่ส่งผลต่อการโต้ตอบระหว่างวัตถุอื่นในทันที เพื่อให้แน่ใจว่าการโต้ตอบเหล่านี้สามารถเปลี่ยนแปลงได้โดยอิสระจากกัน
เหตุใดจึงจำเป็นต้องมีคนกลาง
ดังแสดงในรูปด้านล่าง มีวัตถุจำนวนมากในแผนภาพนี้ วัตถุเหล่านี้สามารถส่งผลกระทบต่อวัตถุอื่นและรับผลกระทบจากวัตถุอื่น ดังนั้นจึงมักเรียกว่าวัตถุเพื่อนร่วมงาน เพื่อนร่วมงานเหล่านี้สร้างพฤติกรรมของระบบผ่านการมีปฏิสัมพันธ์ซึ่งกันและกัน ดังที่เห็นได้จากภาพ เกือบทุกวัตถุจำเป็นต้องมีปฏิสัมพันธ์กับวัตถุอื่น และปฏิสัมพันธ์นี้แสดงออกมาเป็นการเชื่อมต่อโดยตรงระหว่างวัตถุหนึ่งกับวัตถุอีกชิ้นหนึ่ง นี่คือระบบโอเวอร์คัปเปิ้ล
ด้วยการแนะนำวัตถุตัวกลาง (Mediator) โครงสร้างเครือข่ายของระบบสามารถเปลี่ยนเป็นโครงสร้างดาวที่มีศูนย์กลางอยู่ที่ตัวกลางได้ ดังแสดงในรูปด้านล่าง ในโครงสร้างแบบดาวนี้ วัตถุเพื่อนร่วมงานจะไม่โต้ตอบกับวัตถุอื่นผ่านการเชื่อมต่อโดยตรงอีกต่อไป แต่จะโต้ตอบกับวัตถุอื่นผ่านวัตถุตัวกลางแทน การมีอยู่ของวัตถุตัวกลางทำให้มั่นใจได้ถึงความเสถียรของโครงสร้างวัตถุ กล่าวคือ โครงสร้างระบบจะไม่ทำให้เกิดการเปลี่ยนแปลงมากนักเนื่องจากมีการนำวัตถุใหม่มาใช้
การออกแบบเชิงวัตถุที่ดีสามารถเพิ่มการทำงานร่วมกันและลดการเชื่อมโยงระหว่างวัตถุได้ การออกแบบที่คิดมาอย่างดีจะแบ่งระบบออกเป็นกลุ่มวัตถุของเพื่อนร่วมงานที่ให้ความร่วมมือ จากนั้นให้ความรับผิดชอบของวัตถุของเพื่อนร่วมงานแต่ละคนไม่ซ้ำกัน และกำหนดค่าความสัมพันธ์ในการทำงานร่วมกันระหว่างวัตถุเหล่านั้นอย่างเหมาะสมเพื่อให้สามารถทำงานร่วมกันได้
หากไม่มีเมนบอร์ด
ดังที่เราทุกคนทราบกันดีว่าการทำงานร่วมกันระหว่างอุปกรณ์เสริมต่างๆ ในคอมพิวเตอร์ส่วนใหญ่จะเสร็จสิ้นผ่านทางเมนบอร์ด หากไม่มีเมนบอร์ดในคอมพิวเตอร์ อุปกรณ์เสริมต่างๆ จะต้องโต้ตอบกันเองเพื่อส่งข้อมูลระหว่างกัน และเนื่องจากอินเทอร์เฟซของอุปกรณ์เสริมแต่ละชิ้นมีความแตกต่างกัน เมื่อโต้ตอบกัน อินเทอร์เฟซข้อมูลจึงต้องถูกแปลงให้ตรงกัน
โชคดีที่เมนบอร์ดสามารถโต้ตอบกับอุปกรณ์เสริมต่างๆ ได้อย่างสมบูรณ์ผ่านทางเมนบอร์ด อุปกรณ์เสริมแต่ละตัวเพียงแค่ต้องโต้ตอบกับเมนบอร์ดเท่านั้น และเมนบอร์ดก็รู้วิธีจัดการกับอุปกรณ์เสริมทั้งหมด ซึ่งทำให้ง่ายขึ้นมาก
โครงสร้างของรูปแบบตัวกลาง
แผนผังคลาสไดอะแกรมสำหรับรูปแบบผู้ไกล่เกลี่ยแสดงอยู่ด้านล่าง:
โหมดผู้ไกล่เกลี่ยมีบทบาทดังต่อไปนี้:
● บทบาทผู้ไกล่เกลี่ยนามธรรม (ผู้ไกล่เกลี่ย): กำหนดอินเทอร์เฟซจากออบเจ็กต์เพื่อนร่วมงานไปยังออบเจ็กต์ไกล่เกลี่ย ซึ่งวิธีการหลักคือหนึ่งวิธี (หรือมากกว่า) วิธีเหตุการณ์
● บทบาทผู้ไกล่เกลี่ยคอนกรีต (ConcreteMediator) ใช้วิธีการเหตุการณ์ที่ประกาศโดยผู้ไกล่เกลี่ยนามธรรม ผู้ไกล่เกลี่ยเฉพาะจะตระหนักถึงชั้นเรียนของเพื่อนร่วมงานทั้งหมดโดยเฉพาะ และมีหน้าที่รับผิดชอบในการประสานงานการโต้ตอบระหว่างวัตถุของเพื่อนร่วมงานแต่ละรายโดยเฉพาะ
● บทบาทนามธรรมระดับเพื่อนร่วมงาน (เพื่อนร่วมงาน): กำหนดอินเทอร์เฟซจากคนกลางไปยังวัตถุเพื่อนร่วมงาน วัตถุของเพื่อนร่วมงานรู้เฉพาะเกี่ยวกับตัวกลางไกล่เกลี่ยเท่านั้น ไม่ใช่วัตถุของเพื่อนร่วมงานอื่นๆ
● บทบาทของ ConcreteColleague: คลาสเพื่อนร่วมงานที่เป็นรูปธรรมทั้งหมดสืบทอดมาจากคลาสเพื่อนร่วมงานที่เป็นนามธรรม ในการดำเนินธุรกิจของคุณเอง เมื่อคุณต้องการสื่อสารกับเพื่อนร่วมงานคนอื่น ให้สื่อสารกับคนกลางที่ถือธุรกิจนั้น
ซอร์สโค้ด
รหัสการคัดลอกคลาสผู้ไกล่เกลี่ยนามธรรมมีดังนี้:
ผู้ไกล่เกลี่ยอินเทอร์เฟซสาธารณะ {
-
* วัตถุเพื่อนร่วมงานแจ้งวิธีการไกล่เกลี่ยเมื่อมีการเปลี่ยนแปลง
* ให้ผู้ไกล่เกลี่ยรับผิดชอบในการโต้ตอบที่สอดคล้องกับวัตถุเพื่อนร่วมงานอื่น ๆ
-
โมฆะสาธารณะมีการเปลี่ยนแปลง (เพื่อนร่วมงาน c);
-
คลาสผู้ไกล่เกลี่ยที่เป็นรูปธรรม
คัดลอกรหัสรหัสดังต่อไปนี้:
ConcreteMediator ระดับสาธารณะดำเนินการ Mediator {
//ถือและรักษาเพื่อนร่วมงาน A
ConcreteColleagueA เพื่อนร่วมงานA;
//ถือและรักษาเพื่อนร่วมงานบี
ConcreteColleagueB เพื่อนร่วมงาน B;
โมฆะสาธารณะ setColleagueA (เพื่อนร่วมงาน ConcreteColleagueA) {
this.colleagueA = เพื่อนร่วมงานA;
-
โมฆะสาธารณะ setColleagueB (เพื่อนร่วมงาน ConcreteColleagueBB) {
this.colleagueB = เพื่อนร่วมงานB;
-
@แทนที่
โมฆะสาธารณะมีการเปลี่ยนแปลง (เพื่อนร่วมงาน c) {
-
* ชั้นเรียนของเพื่อนร่วมงานมีการเปลี่ยนแปลง ซึ่งโดยปกติแล้วจะต้องมีปฏิสัมพันธ์กับเพื่อนร่วมงานคนอื่นๆ
* ประสานงานวัตถุเพื่อนร่วมงานที่เกี่ยวข้องโดยเฉพาะเพื่อให้บรรลุพฤติกรรมการทำงานร่วมกัน
-
-
-
ชั้นเรียนเพื่อนร่วมงานที่เป็นนามธรรม
คัดลอกรหัสรหัสดังต่อไปนี้:
เพื่อนร่วมงานระดับนามธรรมสาธารณะ {
//ถือวัตถุไกล่เกลี่ย
ผู้ไกล่เกลี่ยส่วนตัว ผู้ไกล่เกลี่ย;
-
*ตัวสร้าง
-
เพื่อนร่วมงานสาธารณะ (ผู้ไกล่เกลี่ยไกล่เกลี่ย){
this.mediator = คนกลาง;
-
-
* รับวัตถุไกล่เกลี่ยที่สอดคล้องกับคลาสเพื่อนร่วมงานปัจจุบัน
-
ผู้ไกล่เกลี่ยสาธารณะ getMediator() {
คนกลางกลับ;
-
-
รหัสเฉพาะสำหรับการคัดลอกคลาสเดียวกันมีดังนี้:
ConcreteColleagueA คลาสสาธารณะขยายเพื่อนร่วมงาน {
ConcreteColleagueA สาธารณะ (ผู้ไกล่เกลี่ย) {
ซุปเปอร์(คนกลาง);
-
-
* ระบุวิธีการดำเนินการบางอย่าง
-
การดำเนินการโมฆะสาธารณะ () {
//แจ้งวัตถุไกล่เกลี่ยเมื่อคุณต้องการสื่อสารกับเพื่อนร่วมงานคนอื่น
getMediator().changed(นี่);
-
-
คัดลอกรหัสรหัสดังต่อไปนี้:
ConcreteColleagueB คลาสสาธารณะขยายเพื่อนร่วมงาน {
ConcreteColleagueB สาธารณะ (ผู้ไกล่เกลี่ย) {
ซุปเปอร์(คนกลาง);
-
-
* ระบุวิธีการดำเนินการบางอย่าง
-
การดำเนินการโมฆะสาธารณะ () {
//แจ้งวัตถุไกล่เกลี่ยเมื่อคุณต้องการสื่อสารกับเพื่อนร่วมงานคนอื่น
getMediator().changed(นี่);
-
-
ใช้คอมพิวเตอร์ของคุณเพื่อชมภาพยนตร์
ในชีวิตประจำวันเรามักจะใช้คอมพิวเตอร์ในการชมภาพยนตร์ มาอธิบายกระบวนการนี้กันดีกว่า
(1) ขั้นแรก ออปติคัลไดรฟ์จำเป็นต้องอ่านข้อมูลบนออปติคัลดิสก์ จากนั้นแจ้งให้เมนบอร์ดทราบว่าสถานะมีการเปลี่ยนแปลง
(2) มาเธอร์บอร์ดรับข้อมูลจากออปติคัลไดรฟ์และส่งข้อมูลไปยัง CPU เพื่อการวิเคราะห์และประมวลผล
(3) หลังจากที่ CPU เสร็จสิ้นการประมวลผล จะแบ่งข้อมูลออกเป็นข้อมูลวิดีโอและข้อมูลเสียง และแจ้งให้เมนบอร์ดทราบว่าประมวลผลเสร็จสิ้นแล้ว
(4) เมนบอร์ดรับข้อมูลที่ประมวลผลโดย CPU และส่งข้อมูลไปยังการ์ดกราฟิกและการ์ดเสียงตามลำดับเพื่อแสดงวิดีโอและส่งเสียง
เพื่อนำตัวอย่างไปใช้โดยใช้รูปแบบตัวกลาง จำเป็นต้องแยกแยะระหว่างวัตถุเพื่อนร่วมงานและวัตถุตัวกลาง แน่นอนว่ามาเธอร์บอร์ดคือสื่อกลาง และอุปกรณ์เสริมต่างๆ เช่น ออปติคัลไดรฟ์ การ์ดเสียง CPU และการ์ดกราฟิกล้วนเป็นเพื่อนร่วมงาน
ซอร์สโค้ด
รหัสการคัดลอกคลาสเพื่อนร่วมงานที่เป็นนามธรรมมีดังนี้:
เพื่อนร่วมงานระดับนามธรรมสาธารณะ {
//ถือวัตถุไกล่เกลี่ย
ผู้ไกล่เกลี่ยส่วนตัว ผู้ไกล่เกลี่ย;
-
*ตัวสร้าง
-
เพื่อนร่วมงานสาธารณะ (ผู้ไกล่เกลี่ยไกล่เกลี่ย){
this.mediator = คนกลาง;
-
-
* รับวัตถุไกล่เกลี่ยที่สอดคล้องกับคลาสเพื่อนร่วมงานปัจจุบัน
-
ผู้ไกล่เกลี่ยสาธารณะ getMediator() {
คนกลางกลับ;
-
-
คลาสเพื่อนร่วมงาน - รหัสการคัดลอกออปติคัลไดรฟ์มีดังนี้:
CDDriver ระดับสาธารณะขยายเพื่อนร่วมงาน {
//อ่านข้อมูลจากออปติคัลไดรฟ์
ข้อมูลสตริงส่วนตัว = "";
-
*ตัวสร้าง
-
CDDriver สาธารณะ (ผู้ไกล่เกลี่ย) {
ซุปเปอร์(คนกลาง);
-
-
* รับข้อมูลที่อ่านจากแผ่นดิสก์
-
สตริงสาธารณะ getData() {
ส่งคืนข้อมูล
-
-
* อ่านซีดี
-
โมฆะสาธารณะ readCD(){
//ก่อนเครื่องหมายจุลภาคคือข้อมูลที่แสดงในวิดีโอ และหลังเครื่องหมายจุลภาคคือเสียง
this.data = "วันพีช ฉันมุ่งมั่นที่จะเป็นราชาโจรสลัด";
//แจ้งเมนบอร์ดว่าสถานะมีการเปลี่ยนแปลง
getMediator().changed(นี่);
-
-
ชั้นเรียนเพื่อนร่วมงาน —— CPU
คัดลอกรหัสรหัสดังต่อไปนี้:
CPU ระดับสาธารณะขยายเพื่อนร่วมงาน {
//สลายข้อมูลวิดีโอ
สตริงส่วนตัว videoData = "";
//สลายข้อมูลเสียง
สตริงส่วนตัว soundData = "";
-
*ตัวสร้าง
-
CPU สาธารณะ (ตัวกลางไกล่เกลี่ย) {
ซุปเปอร์(คนกลาง);
-
-
* รับข้อมูลวิดีโอที่สลายตัว
-
สตริงสาธารณะ getVideoData() {
ส่งคืนข้อมูลวิดีโอ;
-
-
* รับข้อมูลเสียงที่สลายตัว
-
สตริงสาธารณะ getSoundData() {
ส่งกลับข้อมูลเสียง;
-
-
* ประมวลผลข้อมูลและแบ่งข้อมูลออกเป็นข้อมูลเสียงและวิดีโอ
-
โมฆะสาธารณะดำเนินการข้อมูล (ข้อมูลสตริง) {
//แยกส่วนข้อมูล ด้านหน้าเป็นข้อมูลวิดีโอ และด้านหลังเป็นข้อมูลเสียง
สตริง[] array = data.split(",");
this.videoData = อาร์เรย์ [0];
this.soundData = อาร์เรย์ [1];
//แจ้งเมนบอร์ดว่า CPU ทำงานเสร็จแล้ว
getMediator().changed(นี่);
-
-
คลาสเพื่อนร่วมงาน - รหัสการคัดลอกกราฟิกการ์ดมีดังนี้:
VideoCard ระดับสาธารณะขยายเพื่อนร่วมงาน {
-
*ตัวสร้าง
-
VideoCard สาธารณะ (ผู้ไกล่เกลี่ย) {
ซุปเปอร์(คนกลาง);
-
-
* แสดงข้อมูลวิดีโอ
-
โมฆะสาธารณะ showData (ข้อมูลสตริง) {
System.out.println("คุณกำลังรับชม: " + data);
-
-
ระดับเพื่อนร่วมงาน - รหัสคัดลอกการ์ดเสียงมีดังนี้:
การ์ดเสียงคลาสสาธารณะขยายเพื่อนร่วมงาน {
-
*ตัวสร้าง
-
การ์ดเสียงสาธารณะ (ผู้ไกล่เกลี่ย) {
ซุปเปอร์(คนกลาง);
-
-
* สร้างเสียงตามข้อมูลเสียง
-
โมฆะสาธารณะ soundData (ข้อมูลสตริง) {
System.out.println("การพากย์เสียง: " + ข้อมูล);
-
-
รหัสการคัดลอกคลาสผู้ไกล่เกลี่ยนามธรรมมีดังนี้:
ผู้ไกล่เกลี่ยอินเทอร์เฟซสาธารณะ {
-
* วัตถุเพื่อนร่วมงานแจ้งวิธีการไกล่เกลี่ยเมื่อมีการเปลี่ยนแปลง
* ให้ผู้ไกล่เกลี่ยรับผิดชอบในการโต้ตอบที่สอดคล้องกับวัตถุเพื่อนร่วมงานอื่น ๆ
-
โมฆะสาธารณะมีการเปลี่ยนแปลง (เพื่อนร่วมงาน c);
-
รหัสการคัดลอกคลาสผู้ไกล่เกลี่ยเฉพาะมีดังนี้:
MainBoard ระดับสาธารณะใช้ Mediator {
//จำเป็นต้องรู้จักคลาสเพื่อนร่วมงานเพื่อโต้ตอบกับคลาสออปติคัลไดรฟ์
CDDriver ส่วนตัว cdDriver = null;
//จำเป็นต้องรู้จักคลาสเพื่อนร่วมงานเพื่อโต้ตอบกับคลาส CPU
CPU CPU ส่วนตัว = null;
//จำเป็นต้องรู้คลาสของเพื่อนร่วมงานเพื่อโต้ตอบด้วย - คลาสกราฟิกการ์ด
การ์ดวิดีโอส่วนตัว videoCard = null;
//จำเป็นต้องรู้จักคลาสของเพื่อนร่วมงานเพื่อโต้ตอบด้วย - คลาสการ์ดเสียง
การ์ดเสียงการ์ดเสียงส่วนตัว = null;
โมฆะสาธารณะ setCdDriver (CDDriver cdDriver) {
นี้.cdDriver = cdDriver;
-
โมฆะสาธารณะ setCpu (CPU cpu) {
this.cpu = ซีพียู;
-
โมฆะสาธารณะ setVideoCard (การ์ดวิดีโอการ์ด) {
this.videoCard = การ์ดวิดีโอ;
-
โมฆะสาธารณะ setSoundCard (การ์ดเสียงการ์ดเสียง) {
this.soundCard = การ์ดเสียง;
-
@แทนที่
โมฆะสาธารณะมีการเปลี่ยนแปลง (เพื่อนร่วมงาน c) {
ถ้า (อินสแตนซ์ c ของ CDDriver) {
//แสดงว่าออปติคัลไดรฟ์ได้อ่านข้อมูลแล้ว
นี้.opeCDDriverReadData((CDDriver)c);
} อื่นถ้า (อินสแตนซ์ c ของ CPU) {
นี้.opeCPU((CPU)c);
-
-
-
* จัดการการโต้ตอบกับวัตถุอื่นหลังจากที่ออปติคัลไดรฟ์อ่านข้อมูล
-
โมฆะส่วนตัว opeCDDriverReadData (CDDriver cd) {
//ขั้นแรกให้อ่านข้อมูลโดยออปติคัลไดรฟ์
ข้อมูลสตริง = cd.getData();
//ถ่ายโอนข้อมูลเหล่านี้ไปยัง CPU เพื่อการประมวลผล
cpu.executeData(ข้อมูล);
-
-
* จัดการการโต้ตอบระหว่าง CPU และวัตถุอื่น ๆ หลังจากประมวลผลข้อมูล
-
โมฆะส่วนตัว opeCPU (CPU cpu) {
//รับข้อมูลที่ประมวลผลโดย CPU ก่อน
สตริง videoData = cpu.getVideoData();
สตริง soundData = cpu.getSoundData();
//ถ่ายโอนข้อมูลเหล่านี้ไปยังการ์ดกราฟิกและการ์ดเสียงเพื่อแสดงผล
videoCard.showData(ข้อมูลวิดีโอ);
soundCard.soundData(soundData);
-
-
รหัสการคัดลอกคลาสไคลเอนต์เป็นดังนี้:
ลูกค้าคลาสสาธารณะ {
โมฆะสาธารณะคงหลัก (สตริง [] args) {
//สร้างคนกลาง - เมนบอร์ด
ผู้ไกล่เกลี่ยเมนบอร์ด = เมนบอร์ดใหม่ ();
//สร้างชั้นเรียนเพื่อนร่วมงาน
CDDriver cd = CDDriver ใหม่ (ตัวกลาง);
CPU cpu = CPU ใหม่ (ตัวกลาง);
VideoCard vc = การ์ดวิดีโอใหม่ (ตัวกลาง);
การ์ดเสียง sc = การ์ดเสียงใหม่ (ตัวกลาง);
//แจ้งให้ผู้ไกล่เกลี่ยทราบถึงเพื่อนร่วมงานทุกท่าน
คนกลาง.setCdDriver(ซีดี);
คนกลาง.setCpu(ซีพียู);
คนกลาง.setVideoCard(vc);
คนกลาง.setSoundCard(sc);
//เริ่มดูภาพยนตร์ ใส่แผ่นดิสก์ลงในออปติคัลไดรฟ์ จากนั้นออปติคัลไดรฟ์จะเริ่มอ่านแผ่นดิสก์
ซีดี.readCD();
-
-
ผลการวิ่งมีดังนี้:
ข้อดีของรูปแบบผู้ไกล่เกลี่ย
● ข้อต่อหลวม
รูปแบบผู้ไกล่เกลี่ยสรุปการโต้ตอบระหว่างออบเจ็กต์ของเพื่อนร่วมงานหลายรายการลงในออบเจ็กต์ไกล่เกลี่ย ดังนั้นจึงเชื่อมต่อออบเจ็กต์ของเพื่อนร่วมงานอย่างหลวมๆ และบรรลุการพึ่งพาเสริมโดยทั่วไป ด้วยวิธีนี้ วัตถุของเพื่อนร่วมงานสามารถเปลี่ยนแปลงและนำกลับมาใช้ใหม่ได้โดยอิสระ แทนที่จะ "ย้ายที่เดียวและส่งผลกระทบต่อร่างกาย" เหมือนเมื่อก่อน
● การควบคุมการโต้ตอบแบบรวมศูนย์
การโต้ตอบของออบเจ็กต์ของเพื่อนร่วมงานหลายรายการถูกห่อหุ้มไว้ในออบเจ็กต์ตัวกลางสำหรับการจัดการแบบรวมศูนย์ ดังนั้นเมื่อพฤติกรรมการโต้ตอบเหล่านี้เปลี่ยนแปลง คุณเพียงแค่ต้องแก้ไขออบเจ็กต์ตัวกลางเท่านั้น หากเป็นระบบที่เสร็จสมบูรณ์แล้ว ให้ขยายออบเจ็กต์ตัวกลาง และไม่จำเป็นต้องแก้ไขแต่ละชั้นเรียนของเพื่อนร่วมงาน
● หลายต่อหลายรายการจะกลายเป็นแบบหนึ่งต่อกลุ่ม
เมื่อไม่ได้ใช้รูปแบบผู้ไกล่เกลี่ย ความสัมพันธ์ระหว่างออบเจ็กต์ของเพื่อนร่วมงานมักจะเป็นแบบกลุ่มต่อกลุ่ม หลังจากที่มีการแนะนำออบเจ็กต์ไกล่เกลี่ย ความสัมพันธ์ระหว่างออบเจ็กต์ไกล่เกลี่ยและออบเจ็กต์ของเพื่อนร่วมงานมักจะกลายเป็นแบบสองทางแบบหนึ่งต่อกลุ่ม ซึ่งทำให้ความสัมพันธ์ระหว่างวัตถุต่างๆ เข้าใจและนำไปปฏิบัติได้ง่ายขึ้น
ข้อเสียของรูปแบบผู้ไกล่เกลี่ย
ข้อเสียเปรียบที่อาจเกิดขึ้นประการหนึ่งของโมเดลตัวกลางคือการรวมศูนย์มากเกินไป ถ้าปฏิสัมพันธ์ของวัตถุของเพื่อนร่วมงานมีขนาดใหญ่และซับซ้อนมาก เมื่อความซับซ้อนทั้งหมดเหล่านี้มุ่งไปที่ตัวกลาง วัตถุตัวกลางก็จะซับซ้อนมากและยากต่อการจัดการและบำรุงรักษา