2.1 อะแดปเตอร์

อะแดปเตอร์ (Adapter)เป็นรูปแบบการออกแบบโครงสร้างที่ออกแบบมาเพื่อจัดระเบียบการใช้ฟังก์ชันของวัตถุที่ไม่สามารถแก้ไขได้ผ่านส่วนต่อประสานที่สร้างขึ้นเป็นพิเศษ

คำจำกัดความอย่างเป็นทางการนั้นค่อนข้างยุ่งยาก แต่ถ้าคุณพูดเป็นคำพูดของคุณเอง อะแดปเตอร์คือรูปแบบการออกแบบที่ช่วยให้วัตถุที่มีอินเทอร์เฟซที่เข้ากันไม่ได้สามารถทำงานร่วมกันได้

รูปแบบอะแดปเตอร์

ใช้เพื่อจัดระเบียบการใช้ฟังก์ชันของวัตถุที่ไม่สามารถแก้ไขได้ผ่านอินเทอร์เฟซที่สร้างขึ้นเป็นพิเศษ มีการสร้างคลาสเพิ่มเติมที่มีอินเตอร์เฟสที่จำเป็น และคลาสนี้จะเรียกเมธอดของอ็อบเจกต์ที่ต้องการ (ซึ่งไม่มีอินเตอร์เฟสที่จำเป็น)

สำคัญ! หากในโค้ดคุณตรงกับส่วนต่อท้าย Adapter สำหรับคลาส คุณมีสิทธิ์ทุกประการที่จะพิจารณาว่าคลาสนี้ทำหน้าที่เป็น Adapter และเชื่อมโยงกับกลุ่มของคลาสที่ทำงานตามโครงร่างที่อธิบายไว้ข้างต้น

ใช้ในกรณีที่ระบบรองรับข้อมูลและพฤติกรรมที่จำเป็น แต่มีอินเทอร์เฟซที่ไม่เหมาะสม การใช้รูปแบบ Adapter ที่พบมากที่สุดคือเมื่อคุณต้องการสร้างคลาสที่สืบทอดมาจากคลาสนามธรรมใหม่หรือที่มีอยู่

จุดแข็ง:

  • การเปลี่ยนไปใช้คลาสภายนอกอื่นไม่จำเป็นต้องทำระบบใหม่ แค่ปรับใช้คลาส Adapter อีกหนึ่งคลาสก็เพียงพอแล้ว
  • ความเป็นอิสระจากการใช้งานคลาสภายนอก (คลาสจากไลบรารีที่เราไม่สามารถเปลี่ยนรหัสได้) โปรแกรมของคุณจะเป็นอิสระจากอินเทอร์เฟซของคลาสภายนอก

2.2 ช่างตกแต่ง

มัณฑนากรเป็นรูปแบบการออกแบบโครงสร้างสำหรับการแนบพฤติกรรมเพิ่มเติมกับวัตถุแบบไดนามิก รูปแบบมัณฑนากรเป็นทางเลือกที่ดีและยืดหยุ่นสำหรับการฝึกคลาสย่อยเพื่อขยายฟังก์ชันการทำงาน

รูปแบบการตกแต่ง

ใช้เพื่อเชื่อมต่อภาระผูกพันเพิ่มเติมกับวัตถุแบบไดนามิก

พวกคุณหลายคนจะถามว่า: คุณจะเพิ่มพฤติกรรมใหม่ให้กับวัตถุแบบไดนามิก (ในขณะที่โปรแกรมกำลังทำงาน) ได้อย่างไร วัตถุสามารถประกอบขึ้นจากชิ้นส่วน นั่นคือ วัตถุขนาดเล็ก จำตัวกรองเชนในเซิร์ฟเล็ตได้ไหม หรือ Stream API เมื่อคุณเขียนคำค้นหาโดยใช้ filter(), map(), list()

IntStream.of(50, 60, 70, 80, 90).filter(x -> x < 90).map(x -> x + 10).limit(3).forEach(System.out::print);

จุดแข็งของรูปแบบมัณฑนากร:

  • ไม่จำเป็นต้องสร้างคลาสย่อยเพื่อขยายการทำงานของอ็อบเจกต์
  • ความสามารถในการเชื่อมต่อการทำงานใหม่แบบไดนามิกได้ทุกที่: ก่อนหรือหลังการทำงานหลักของวัตถุ ConcreteComponent

2.3 ผู้รับมอบฉันทะ

Proxyเป็นรูปแบบการออกแบบโครงสร้างที่ให้วัตถุที่ควบคุมการเข้าถึงวัตถุอื่น สกัดกั้นและผ่านการเรียกทั้งหมด

รอง (ผู้รับมอบฉันทะ)

รูปแบบ Proxy จัดเตรียมวัตถุทดแทนแทนวัตถุจริง วัตถุนี้ควบคุมการเข้าถึงวัตถุต้นฉบับ ใช้บ่อยมาก

จำวิธีที่เราใช้เฟรมเวิร์ก Mockito และสกัดกั้นการเรียกไปยังวัตถุจริงโดยใช้เมธอด Mockito.spy() หรือคำอธิบายประกอบ @Spy ได้อย่างไร จากนั้นจึงสร้างวัตถุพร็อกซีพิเศษขึ้น ซึ่งการเรียกทั้งหมดไปยังวัตถุดั้งเดิมจะผ่านไป

จากนั้นเราสามารถจัดการการโทรเหล่านี้ได้โดยเพิ่มกฎให้กับวัตถุ ถูกต้อง - วัตถุดั้งเดิมไม่เปลี่ยนแปลงและการทำงานกับวัตถุนั้นจะมีความยืดหยุ่นมากขึ้น มีประโยชน์อย่างยิ่งเมื่อเราไม่เรียกใช้วัตถุพร็อกซีจากโค้ดของเรา แต่ส่งต่อไปยังที่ใดที่หนึ่ง ดังนั้นการควบคุมการสื่อสารของสองวัตถุที่เป็นอิสระจากเรา

ประเภทของผู้รับมอบฉันทะตามวัตถุประสงค์:

  • การบันทึกพร็อกซี : บันทึกการโทรทั้งหมดไปยัง "เรื่อง" ด้วยพารามิเตอร์
  • พร็อกซีระยะไกล (พร็อกซีระยะไกล): ให้การสื่อสารกับ "เรื่อง" ซึ่งอยู่ในพื้นที่ที่อยู่อื่นหรือบนเครื่องระยะไกล นอกจากนี้ยังอาจรับผิดชอบในการเข้ารหัสคำขอและอาร์กิวเมนต์และส่งคำขอที่เข้ารหัสไปยัง "Subject" จริง
  • พร็อกซีเสมือน (พร็อกซีเสมือน): รับรองว่า "หัวเรื่อง" จริงจะถูกสร้างขึ้นเฉพาะเมื่อจำเป็นเท่านั้น นอกจากนี้ยังสามารถแคชข้อมูลบางอย่างเกี่ยวกับ "Subject" จริงเพื่อชะลอการสร้าง
  • Copy-on-write : ให้สำเนาของ "หัวเรื่อง" เมื่อไคลเอนต์ดำเนินการบางอย่าง (กรณีพิเศษของ "พร็อกซีเสมือน")
  • พร็อกซีคุ้มครอง : สามารถตรวจสอบได้ว่าผู้โทรมีสิทธิ์ที่จำเป็นในการร้องขอหรือไม่
  • Caching Proxy : จัดเก็บผลการคำนวณชั่วคราวก่อนที่จะให้บริการกับไคลเอนต์หลาย ๆ รายที่สามารถแบ่งปันผลลัพธ์ได้
  • Screening Proxy: ปกป้อง "Subject" จากไคลเอ็นต์ที่เป็นอันตราย (หรือในทางกลับกัน)
  • Synchronization Proxy : ดำเนินการซิงโครไนซ์การควบคุมการเข้าถึงไปยัง "Subject" ในสภาพแวดล้อมแบบมัลติเธรดแบบอะซิงโครนัส
  • ลิงก์ "อัจฉริยะ" (พร็อกซีอ้างอิงอัจฉริยะ): ดำเนินการเพิ่มเติมเมื่อมีการสร้างลิงก์ไปยัง "หัวเรื่อง" เช่น คำนวณจำนวนลิงก์ที่ใช้งานไปยัง "หัวเรื่อง"

2.4 สะพาน

รูปแบบสะพานเป็นรูปแบบการออกแบบโครงสร้างที่ใช้ในการ "แยกสิ่งที่เป็นนามธรรมและการนำไปใช้เพื่อให้สามารถเปลี่ยนแปลงได้อย่างอิสระ"

รูปแบบบริดจ์ใช้การห่อหุ้ม การรวม และสามารถใช้การสืบทอดเพื่อแบ่งปันความรับผิดชอบระหว่างคลาส

สะพาน

เมื่อสิ่งที่เป็นนามธรรมและการปฏิบัติถูกแยกออกจากกัน พวกเขาสามารถเปลี่ยนแปลงได้อย่างอิสระ กล่าวอีกนัยหนึ่ง เมื่อใช้งานผ่านรูปแบบบริดจ์ การเปลี่ยนโครงสร้างของอินเทอร์เฟซจะไม่รบกวนการเปลี่ยนแปลงโครงสร้างของการใช้งาน

พิจารณาสิ่งที่เป็นนามธรรมเป็นรูป มีรูปร่างหลายประเภท แต่ละประเภทมีคุณสมบัติและวิธีการของตัวเอง อย่างไรก็ตาม มีบางอย่างที่รวมตัวเลขทั้งหมดเข้าด้วยกัน เช่น แต่ละรูปทรงต้องสามารถวาดเอง ปรับขนาด และอื่นๆ ได้

ในขณะเดียวกัน การวาดกราฟิกอาจแตกต่างกันไปขึ้นอยู่กับประเภทของระบบปฏิบัติการหรือไลบรารีกราฟิก รูปร่างควรจะสามารถวาดตัวเองในสภาพแวดล้อมกราฟิกต่างๆ แต่การใช้วิธีการวาดทั้งหมดในแต่ละรูปทรงนั้นทำไม่ได้ หรือการปรับเปลี่ยนรูปร่างทุกครั้งที่วิธีการวาดเปลี่ยนไป

ในกรณีนี้ รูปแบบบริดจ์จะช่วยได้ ช่วยให้คุณสร้างคลาสใหม่ที่จะใช้การวาดในสภาพแวดล้อมแบบกราฟิกต่างๆ เมื่อใช้วิธีการนี้ มันง่ายมากที่จะเพิ่มทั้งรูปร่างใหม่และวิธีการวาด

การเชื่อมต่อที่แสดงโดยลูกศรในไดอะแกรมสามารถมีได้ 2 ความหมาย: a) "ชนิด" ตามหลักการแทนที่ของ Liskov และ b) หนึ่งในการนำสิ่งที่เป็นนามธรรมไปใช้ ภาษาโดยทั่วไปใช้การสืบทอดเพื่อใช้งานทั้ง a) และ b) ซึ่งมีแนวโน้มที่จะขยายลำดับชั้นของคลาส

สะพานทำหน้าที่แก้ปัญหานี้อย่างแน่นอน: วัตถุถูกสร้างขึ้นเป็นคู่จากวัตถุของคลาสของลำดับชั้น A และลำดับชั้น B การสืบทอดภายในลำดับชั้น A มีความหมายเป็น "ความหลากหลาย" ตาม Liskov และสำหรับแนวคิดของ "การนำไปใช้ ของสิ่งที่เป็นนามธรรม” จะใช้การเชื่อมโยงจากวัตถุ A ไปยังวัตถุ B ที่จับคู่กัน

2.5 ซุ้ม

รูปแบบ Facadeเป็นรูปแบบการออกแบบโครงสร้างที่ซ่อนความซับซ้อนของระบบโดยลดการเรียกจากภายนอกที่เป็นไปได้ทั้งหมดไปยังออบเจ็กต์เดียวที่มอบหมายให้กับออบเจ็กต์ที่เหมาะสมในระบบ

เทมเพลต Facade

วิธีจัดเตรียมอินเทอร์เฟซแบบรวมที่มีชุดของการใช้งานหรืออินเทอร์เฟซที่แตกต่างกัน ตัวอย่างเช่น กับระบบย่อย หากการมีเพศสัมพันธ์ที่รัดกุมกับระบบย่อยนั้นเป็นสิ่งที่ไม่พึงปรารถนา หรือการนำไปใช้ของระบบย่อยอาจเปลี่ยนแปลงได้อย่างไร

กำหนดจุดหนึ่งของการโต้ตอบกับระบบย่อย - วัตถุส่วนหน้าที่จัดเตรียมส่วนต่อประสานทั่วไปกับระบบย่อย และกำหนดความรับผิดชอบสำหรับการโต้ตอบกับส่วนประกอบต่างๆ ซุ้มเป็นวัตถุภายนอกที่มีจุดเริ่มต้นเดียวสำหรับบริการระบบย่อย

การใช้คอมโพเนนต์ระบบย่อยอื่นๆ เป็นแบบส่วนตัวและคอมโพเนนต์ภายนอกไม่สามารถมองเห็นได้ วัตถุ Facade ให้การดำเนินการตามรูปแบบ GRASP ทนต่อการเปลี่ยนแปลงในแง่ของการป้องกันการเปลี่ยนแปลงในการใช้งานระบบย่อย

สำคัญ! รูปแบบนี้ใช้เมื่อเราต้องการซ่อนกลุ่มของวัตถุทั้งหมดและส่งผ่านการสื่อสารทั้งหมดผ่านวัตถุของเรา หากคุณต้องการให้การควบคุมกระบวนการสื่อสารของอ็อบเจ็กต์บางอย่างและไม่จำเป็นต้องซ่อนมัน จะเป็นการดีกว่าถ้าใช้รูปแบบพร็อกซี