23 โหมดการออกแบบ 20: โมเดลตัวกลาง Java
คำจำกัดความ: ห่อหุ้มชุดการโต้ตอบของวัตถุกับวัตถุสื่อกลาง ผู้ไกล่เกลี่ยทำให้แต่ละวัตถุมีปฏิสัมพันธ์โดยไม่มีการแสดงผลดังนั้นจึงคลายการมีเพศสัมพันธ์และเปลี่ยนปฏิสัมพันธ์ระหว่างพวกเขาอย่างอิสระ
ประเภท: รูปแบบพฤติกรรม
แผนภาพชั้นเรียน:
โครงสร้างของแบบจำลองตัวกลาง
โหมดตัวกลางเรียกว่าโหมดสื่อกลาง จากแผนภาพคลาสจะแบ่งออกเป็น 3 ส่วน:
บทคัดย่อสื่อกลาง: กำหนดอินเทอร์เฟซระหว่างวัตถุคลาสเพื่อนร่วมงานและวัตถุสื่อกลางและใช้สำหรับการสื่อสารระหว่างเพื่อนร่วมงานแต่ละคน โดยทั่วไปจะมีวิธีการจัดงานนามธรรมหนึ่งหรือหลายวิธีและดำเนินการโดยคลาสย่อย
ระดับการใช้งานตัวกลาง: สืบทอดมาจากผู้ไกล่เกลี่ยนามธรรมและใช้วิธีการเหตุการณ์ที่กำหนดไว้ในสื่อกลางที่เป็นนามธรรม รับข้อความจากชั้นเรียนเพื่อนร่วมงานคนหนึ่งแล้วมีอิทธิพลต่อคลาสอื่น ๆ พร้อมกันผ่านข้อความ
คลาสเพื่อนร่วมงาน: หากวัตถุมีผลต่อวัตถุอื่น ๆ และได้รับผลกระทบจากวัตถุอื่น ๆ วัตถุทั้งสองนี้จะเรียกว่าคลาสเพื่อนร่วมงาน ในไดอะแกรมของชั้นเรียนมีชั้นเรียนเพื่อนร่วมงานเพียงคนเดียวซึ่งเป็นการละเว้นความเป็นจริง ในการใช้งานจริงคลาสเพื่อนร่วมงานมักจะประกอบด้วยหลายอย่างและมีอิทธิพลและพึ่งพาซึ่งกันและกัน ยิ่งเพื่อนร่วมงานมีความสัมพันธ์ที่ซับซ้อนมากขึ้นเท่านั้น ยิ่งไปกว่านั้นคลาสเพื่อนร่วมงานยังสามารถแสดงเป็นชุดของการใช้งานที่สืบทอดคลาสนามธรรมเดียวกัน ในรูปแบบตัวกลางข้อความจะต้องส่งผ่านตัวกลางระหว่างเพื่อนร่วมงาน
ทำไมต้องใช้แบบจำลองตัวกลาง
โดยทั่วไปความสัมพันธ์ระหว่างชั้นเรียนเพื่อนร่วมงานค่อนข้างซับซ้อน เมื่อคลาสเพื่อนร่วมงานหลายคนมีความสัมพันธ์กันความสัมพันธ์ของพวกเขาจะปรากฏเป็นโครงสร้างตาข่ายที่ซับซ้อน นี่เป็นสถาปัตยกรรมที่มากเกินไปนั่นคือมันไม่เอื้อต่อการใช้ซ้ำในชั้นเรียนและไม่มั่นคง ตัวอย่างเช่นในรูปด้านล่างมีวัตถุคล้ายเพื่อนร่วมงานหกชิ้น หากวัตถุ 1 เปลี่ยนแปลงวัตถุ 4 วัตถุจะได้รับผลกระทบ หากวัตถุ 2 เปลี่ยนแปลงวัตถุ 5 ชิ้นจะได้รับผลกระทบ กล่าวอีกนัยหนึ่งการออกแบบความสัมพันธ์โดยตรงระหว่างเพื่อนร่วมงานไม่ดี
หากมีการแนะนำแบบจำลองตัวกลางความสัมพันธ์ระหว่างชั้นเรียนเพื่อนร่วมงานจะกลายเป็นโครงสร้างดาว จากรูปเราจะเห็นได้ว่าการเปลี่ยนแปลงในชั้นเรียนใด ๆ จะส่งผลกระทบต่อชั้นเรียนและตัวกลางเท่านั้นซึ่งจะลดการมีเพศสัมพันธ์ของระบบ การออกแบบที่ดีจะไม่ห่อหุ้มตรรกะการประมวลผลการเชื่อมโยงวัตถุทั้งหมดในชั้นเรียนนี้ แต่จะใช้คลาสพิเศษเพื่อจัดการพฤติกรรมที่ไม่ได้เป็นของคุณ
ลองใช้ตัวอย่างเพื่อแสดงให้เห็นว่าคลาสเพื่อนร่วมงานคืออะไร: มีสองคลาส A และ B ซึ่งแต่ละคลาสมีตัวเลขและเราต้องตรวจสอบให้แน่ใจว่าตัวเลขในคลาส B มักจะอยู่ในระดับ A 100 เท่าในชั้นเรียน A นั่นคือเมื่อปรับเปลี่ยนจำนวนคลาส A รหัสมีดังนี้:
บทคัดย่อคลาส AbstractColleague {หมายเลข int ที่ได้รับการป้องกัน สาธารณะ int getNumber () {หมายเลขคืน; } โมฆะสาธารณะ setNumber (หมายเลข int) {this.number = number; } // วิธีนามธรรม, แก้ไขวัตถุที่เกี่ยวข้องในเวลาเดียวกันเมื่อแก้ไขตัวเลขโมฆะนามธรรมสาธารณะ setNumber (หมายเลข int, AbstractColleague Coll); } เพื่อนร่วมงานชั้นเรียนขยาย AbstractColleague {โมฆะสาธารณะ setNumber (หมายเลข int, AbstractColleague Coll) {this.number = จำนวน; coll.setNumber (หมายเลข*100); }} คลาสเพื่อนร่วมงานขยาย AbstractColleague {โมฆะสาธารณะ setNumber (หมายเลข int, AbstractColleague Coll) {this.number = จำนวน; coll.setNumber (หมายเลข/100); }} ไคลเอนต์คลาสสาธารณะ {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {AbstractColleague colla = เพื่อนร่วมงานใหม่ (); AbstractColleague Collb = เพื่อนร่วมงานใหม่ (); System.out.println ("================================================== - - - - - - - System.out.println ("ค่าของ Collb:"+collb.getNumber ()); ในรหัสข้างต้น Class A และ B เกี่ยวข้องผ่านการเชื่อมโยงโดยตรง หากเราต้องการใช้แบบจำลองตัวกลาง Class A และ B ไม่สามารถเกี่ยวข้องโดยตรงได้ พวกเขาจะต้องใช้ตัวกลางเพื่อให้บรรลุวัตถุประสงค์ของการเชื่อมโยง
บทคัดย่อคลาส AbstractColleague {หมายเลข int ที่ได้รับการป้องกัน สาธารณะ int getNumber () {หมายเลขคืน; } โมฆะสาธารณะ setNumber (หมายเลข int) {this.number = number; } // โปรดทราบว่าพารามิเตอร์ที่นี่ไม่ใช่เพื่อนร่วมงานอีกต่อไป แต่เป็นโมฆะนามธรรมสาธารณะตัวกลาง (หมายเลข int, Abstractediator AM); } เพื่อนร่วมงานชั้นเรียนขยาย AbstractColleague {โมฆะสาธารณะ setNumber (หมายเลข int, AbstractedMediator am) {this.number = จำนวน; am.aaffectb (); }} คลาสเพื่อนร่วมงานขยาย AbstractColleague {@Override โมฆะสาธารณะ setNumber (หมายเลข int, Abstractediator am) {this.number = จำนวน; am.baffecta (); }} คลาสบทคัดย่อ AbstractMediator {Protected AbstractColleague A; ได้รับการป้องกัน AbstractColleague B; Public Abstractediator (AbstractColleague A, AbstractColleague B) {a = a; B = B; } บทคัดย่อสาธารณะเป็นโมฆะ AAFFECTB (); บทคัดย่อสาธารณะเป็นโมฆะ Baffecta (); } คลาส Mediator ขยายบทคัดย่อ {Mediator สาธารณะ (AbstractColleague A, AbstractColleague B) {Super (A, B); } // จัดการกับผลกระทบของ A on B Public Void AAFFECTB () {หมายเลข int = A.getNumber (); b.setNumber (หมายเลข*100); } // จัดการกับผลกระทบของ B ต่อโมฆะสาธารณะ baffecta () {หมายเลข int = b.getNumber (); A.SetNumber (หมายเลข/100); }} ไคลเอนต์คลาสสาธารณะ {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {AbstractColleague colla = เพื่อนร่วมงานใหม่ (); AbstractColleague Collb = เพื่อนร่วมงานใหม่ (); Abstract Mediator AM = ผู้ไกล่เกลี่ยใหม่ (colla, collb); System.out.println ("========================= effect โดยการตั้งค่า a ================================================================================================================= - - - System.out.println ("ค่าหมายเลขของ Colla คือ:"+colla.getNumber ()); b ======================================================================================================== - - - System.out.println ("ค่าหมายเลขของ Collb คือ:"+collb.getNumber ());แม้ว่ารหัสจะค่อนข้างยาว แต่ก็ยังเข้าใจได้ง่าย ในความเป็นจริงมันคือการจัดทำซ้ำรหัสที่ แต่เดิมจัดการความสัมพันธ์ของวัตถุในคลาสการไกล่เกลี่ยและจัดการกับความสัมพันธ์ระหว่างวัตถุผ่านระดับการไกล่เกลี่ยนี้
ข้อดีของแบบจำลองตัวกลาง
1. การใช้แบบจำลองตัวกลางที่เหมาะสมสามารถหลีกเลี่ยงการมีเพศสัมพันธ์มากเกินไประหว่างชั้นเรียนเพื่อนร่วมงานเพื่อให้สามารถใช้คลาสเพื่อนร่วมงานได้อย่างอิสระ
2. การใช้รูปแบบสื่อกลางสามารถเปลี่ยนความสัมพันธ์แบบหนึ่งต่อหลาย ๆ ระหว่างวัตถุไปเป็นความสัมพันธ์แบบตัวต่อตัวทำให้ความสัมพันธ์ระหว่างวัตถุเข้าใจและบำรุงรักษาง่าย
3. การใช้แบบจำลองตัวกลางสามารถนามธรรมพฤติกรรมและการทำงานร่วมกันของวัตถุและสามารถจัดการการโต้ตอบระหว่างวัตถุได้อย่างยืดหยุ่นมากขึ้น
สถานการณ์ที่เกี่ยวข้อง
ในการเขียนโปรแกรมเชิงวัตถุคลาสจะขึ้นอยู่กับคลาสอื่น ๆ อย่างหลีกเลี่ยงไม่ได้และคลาสอิสระที่สมบูรณ์นั้นไม่มีความหมาย นอกจากนี้ยังเป็นเรื่องธรรมดาสำหรับชั้นเรียนที่จะพึ่งพาหลายชั้นเรียนในเวลาเดียวกัน เนื่องจากสถานการณ์ดังกล่าวมีอยู่หมายความว่าการพึ่งพาแบบหนึ่งต่อหลายคนมีเหตุผล การใช้รูปแบบสื่อกลางที่เหมาะสมสามารถทำให้ความสัมพันธ์ของวัตถุยุ่งเหยิงในขั้นต้นชัดเจน แต่ถ้ามันถูกทารุณกรรมมันอาจนำผลกระทบเชิงลบ โดยทั่วไปแล้วโมเดลคนกลางจะได้รับการพิจารณาเฉพาะสำหรับความสัมพันธ์ระหว่างคลาสเพื่อนร่วมงานที่มีโครงสร้างตาข่าย โครงสร้างตาข่ายสามารถเปลี่ยนเป็นโครงสร้างดาวเพื่อทำให้ความสัมพันธ์ระหว่างเพื่อนร่วมงานชัดเจนขึ้น
โมเดลตัวกลางเป็นแบบจำลองที่ค่อนข้างธรรมดาและเป็นแบบจำลองที่ค่อนข้างง่าย ในกรณีส่วนใหญ่ความสัมพันธ์ระหว่างชั้นเรียนเพื่อนร่วมงานจะไม่ซับซ้อนกับโครงสร้างตาข่ายที่วุ่นวาย ดังนั้นในกรณีส่วนใหญ่มันก็โอเคที่จะห่อหุ้มการพึ่งพาระหว่างวัตถุภายในคลาสเพื่อนร่วมงานและไม่จำเป็นต้องแนะนำแบบจำลองตัวกลาง การใช้โมเดลตัวกลางในทางที่ผิดจะทำให้สิ่งต่าง ๆ มีความซับซ้อนมากขึ้นเท่านั้น
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น