2.1 อะแดปเตอร์
อะแดปเตอร์ (Adapter)เป็นรูปแบบการออกแบบโครงสร้างที่ออกแบบมาเพื่อจัดระเบียบการใช้ฟังก์ชันของวัตถุที่ไม่สามารถแก้ไขได้ผ่านส่วนต่อประสานที่สร้างขึ้นเป็นพิเศษ
คำจำกัดความอย่างเป็นทางการนั้นค่อนข้างยุ่งยาก แต่ถ้าคุณพูดเป็นคำพูดของคุณเอง อะแดปเตอร์คือรูปแบบการออกแบบที่ช่วยให้วัตถุที่มีอินเทอร์เฟซที่เข้ากันไม่ได้สามารถทำงานร่วมกันได้
![รูปแบบอะแดปเตอร์](https://cdn.codegym.cc/images/article/95aa4e6d-a7eb-4f5b-a228-9bbe87547610/800.jpeg)
ใช้เพื่อจัดระเบียบการใช้ฟังก์ชันของวัตถุที่ไม่สามารถแก้ไขได้ผ่านอินเทอร์เฟซที่สร้างขึ้นเป็นพิเศษ มีการสร้างคลาสเพิ่มเติมที่มีอินเตอร์เฟสที่จำเป็น และคลาสนี้จะเรียกเมธอดของอ็อบเจกต์ที่ต้องการ (ซึ่งไม่มีอินเตอร์เฟสที่จำเป็น)
สำคัญ! หากในโค้ดคุณตรงกับส่วนต่อท้าย Adapter สำหรับคลาส คุณมีสิทธิ์ทุกประการที่จะพิจารณาว่าคลาสนี้ทำหน้าที่เป็น Adapter และเชื่อมโยงกับกลุ่มของคลาสที่ทำงานตามโครงร่างที่อธิบายไว้ข้างต้น
ใช้ในกรณีที่ระบบรองรับข้อมูลและพฤติกรรมที่จำเป็น แต่มีอินเทอร์เฟซที่ไม่เหมาะสม การใช้รูปแบบ Adapter ที่พบมากที่สุดคือเมื่อคุณต้องการสร้างคลาสที่สืบทอดมาจากคลาสนามธรรมใหม่หรือที่มีอยู่
จุดแข็ง:
- การเปลี่ยนไปใช้คลาสภายนอกอื่นไม่จำเป็นต้องทำระบบใหม่ แค่ปรับใช้คลาส Adapter อีกหนึ่งคลาสก็เพียงพอแล้ว
- ความเป็นอิสระจากการใช้งานคลาสภายนอก (คลาสจากไลบรารีที่เราไม่สามารถเปลี่ยนรหัสได้) โปรแกรมของคุณจะเป็นอิสระจากอินเทอร์เฟซของคลาสภายนอก
2.2 ช่างตกแต่ง
มัณฑนากรเป็นรูปแบบการออกแบบโครงสร้างสำหรับการแนบพฤติกรรมเพิ่มเติมกับวัตถุแบบไดนามิก รูปแบบมัณฑนากรเป็นทางเลือกที่ดีและยืดหยุ่นสำหรับการฝึกคลาสย่อยเพื่อขยายฟังก์ชันการทำงาน
![รูปแบบการตกแต่ง](https://cdn.codegym.cc/images/article/c8dcccfe-d3d4-4054-bca0-a984f7371f76/800.jpeg)
ใช้เพื่อเชื่อมต่อภาระผูกพันเพิ่มเติมกับวัตถุแบบไดนามิก
พวกคุณหลายคนจะถามว่า: คุณจะเพิ่มพฤติกรรมใหม่ให้กับวัตถุแบบไดนามิก (ในขณะที่โปรแกรมกำลังทำงาน) ได้อย่างไร วัตถุสามารถประกอบขึ้นจากชิ้นส่วน นั่นคือ วัตถุขนาดเล็ก จำตัวกรองเชนในเซิร์ฟเล็ตได้ไหม หรือ 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เป็นรูปแบบการออกแบบโครงสร้างที่ให้วัตถุที่ควบคุมการเข้าถึงวัตถุอื่น สกัดกั้นและผ่านการเรียกทั้งหมด
![รอง (ผู้รับมอบฉันทะ)](https://cdn.codegym.cc/images/article/5f67cf48-0f30-42ca-aa0c-661e9121210d/800.jpeg)
รูปแบบ Proxy จัดเตรียมวัตถุทดแทนแทนวัตถุจริง วัตถุนี้ควบคุมการเข้าถึงวัตถุต้นฉบับ ใช้บ่อยมาก
จำวิธีที่เราใช้เฟรมเวิร์ก Mockito และสกัดกั้นการเรียกไปยังวัตถุจริงโดยใช้เมธอด Mockito.spy() หรือคำอธิบายประกอบ @Spy ได้อย่างไร จากนั้นจึงสร้างวัตถุพร็อกซีพิเศษขึ้น ซึ่งการเรียกทั้งหมดไปยังวัตถุดั้งเดิมจะผ่านไป
จากนั้นเราสามารถจัดการการโทรเหล่านี้ได้โดยเพิ่มกฎให้กับวัตถุ ถูกต้อง - วัตถุดั้งเดิมไม่เปลี่ยนแปลงและการทำงานกับวัตถุนั้นจะมีความยืดหยุ่นมากขึ้น มีประโยชน์อย่างยิ่งเมื่อเราไม่เรียกใช้วัตถุพร็อกซีจากโค้ดของเรา แต่ส่งต่อไปยังที่ใดที่หนึ่ง ดังนั้นการควบคุมการสื่อสารของสองวัตถุที่เป็นอิสระจากเรา
ประเภทของผู้รับมอบฉันทะตามวัตถุประสงค์:
- การบันทึกพร็อกซี : บันทึกการโทรทั้งหมดไปยัง "เรื่อง" ด้วยพารามิเตอร์
- พร็อกซีระยะไกล (พร็อกซีระยะไกล): ให้การสื่อสารกับ "เรื่อง" ซึ่งอยู่ในพื้นที่ที่อยู่อื่นหรือบนเครื่องระยะไกล นอกจากนี้ยังอาจรับผิดชอบในการเข้ารหัสคำขอและอาร์กิวเมนต์และส่งคำขอที่เข้ารหัสไปยัง "Subject" จริง
- พร็อกซีเสมือน (พร็อกซีเสมือน): รับรองว่า "หัวเรื่อง" จริงจะถูกสร้างขึ้นเฉพาะเมื่อจำเป็นเท่านั้น นอกจากนี้ยังสามารถแคชข้อมูลบางอย่างเกี่ยวกับ "Subject" จริงเพื่อชะลอการสร้าง
- Copy-on-write : ให้สำเนาของ "หัวเรื่อง" เมื่อไคลเอนต์ดำเนินการบางอย่าง (กรณีพิเศษของ "พร็อกซีเสมือน")
- พร็อกซีคุ้มครอง : สามารถตรวจสอบได้ว่าผู้โทรมีสิทธิ์ที่จำเป็นในการร้องขอหรือไม่
- Caching Proxy : จัดเก็บผลการคำนวณชั่วคราวก่อนที่จะให้บริการกับไคลเอนต์หลาย ๆ รายที่สามารถแบ่งปันผลลัพธ์ได้
- Screening Proxy: ปกป้อง "Subject" จากไคลเอ็นต์ที่เป็นอันตราย (หรือในทางกลับกัน)
- Synchronization Proxy : ดำเนินการซิงโครไนซ์การควบคุมการเข้าถึงไปยัง "Subject" ในสภาพแวดล้อมแบบมัลติเธรดแบบอะซิงโครนัส
- ลิงก์ "อัจฉริยะ" (พร็อกซีอ้างอิงอัจฉริยะ): ดำเนินการเพิ่มเติมเมื่อมีการสร้างลิงก์ไปยัง "หัวเรื่อง" เช่น คำนวณจำนวนลิงก์ที่ใช้งานไปยัง "หัวเรื่อง"
2.4 สะพาน
รูปแบบสะพานเป็นรูปแบบการออกแบบโครงสร้างที่ใช้ในการ "แยกสิ่งที่เป็นนามธรรมและการนำไปใช้เพื่อให้สามารถเปลี่ยนแปลงได้อย่างอิสระ"
รูปแบบบริดจ์ใช้การห่อหุ้ม การรวม และสามารถใช้การสืบทอดเพื่อแบ่งปันความรับผิดชอบระหว่างคลาส
![สะพาน](https://cdn.codegym.cc/images/article/ec00bb42-3e78-4eb5-9b0d-b72ed9a63d4f/800.jpeg)
เมื่อสิ่งที่เป็นนามธรรมและการปฏิบัติถูกแยกออกจากกัน พวกเขาสามารถเปลี่ยนแปลงได้อย่างอิสระ กล่าวอีกนัยหนึ่ง เมื่อใช้งานผ่านรูปแบบบริดจ์ การเปลี่ยนโครงสร้างของอินเทอร์เฟซจะไม่รบกวนการเปลี่ยนแปลงโครงสร้างของการใช้งาน
พิจารณาสิ่งที่เป็นนามธรรมเป็นรูป มีรูปร่างหลายประเภท แต่ละประเภทมีคุณสมบัติและวิธีการของตัวเอง อย่างไรก็ตาม มีบางอย่างที่รวมตัวเลขทั้งหมดเข้าด้วยกัน เช่น แต่ละรูปทรงต้องสามารถวาดเอง ปรับขนาด และอื่นๆ ได้
ในขณะเดียวกัน การวาดกราฟิกอาจแตกต่างกันไปขึ้นอยู่กับประเภทของระบบปฏิบัติการหรือไลบรารีกราฟิก รูปร่างควรจะสามารถวาดตัวเองในสภาพแวดล้อมกราฟิกต่างๆ แต่การใช้วิธีการวาดทั้งหมดในแต่ละรูปทรงนั้นทำไม่ได้ หรือการปรับเปลี่ยนรูปร่างทุกครั้งที่วิธีการวาดเปลี่ยนไป
ในกรณีนี้ รูปแบบบริดจ์จะช่วยได้ ช่วยให้คุณสร้างคลาสใหม่ที่จะใช้การวาดในสภาพแวดล้อมแบบกราฟิกต่างๆ เมื่อใช้วิธีการนี้ มันง่ายมากที่จะเพิ่มทั้งรูปร่างใหม่และวิธีการวาด
การเชื่อมต่อที่แสดงโดยลูกศรในไดอะแกรมสามารถมีได้ 2 ความหมาย: a) "ชนิด" ตามหลักการแทนที่ของ Liskov และ b) หนึ่งในการนำสิ่งที่เป็นนามธรรมไปใช้ ภาษาโดยทั่วไปใช้การสืบทอดเพื่อใช้งานทั้ง a) และ b) ซึ่งมีแนวโน้มที่จะขยายลำดับชั้นของคลาส
สะพานทำหน้าที่แก้ปัญหานี้อย่างแน่นอน: วัตถุถูกสร้างขึ้นเป็นคู่จากวัตถุของคลาสของลำดับชั้น A และลำดับชั้น B การสืบทอดภายในลำดับชั้น A มีความหมายเป็น "ความหลากหลาย" ตาม Liskov และสำหรับแนวคิดของ "การนำไปใช้ ของสิ่งที่เป็นนามธรรม” จะใช้การเชื่อมโยงจากวัตถุ A ไปยังวัตถุ B ที่จับคู่กัน
2.5 ซุ้ม
รูปแบบ Facadeเป็นรูปแบบการออกแบบโครงสร้างที่ซ่อนความซับซ้อนของระบบโดยลดการเรียกจากภายนอกที่เป็นไปได้ทั้งหมดไปยังออบเจ็กต์เดียวที่มอบหมายให้กับออบเจ็กต์ที่เหมาะสมในระบบ
![เทมเพลต Facade](https://cdn.codegym.cc/images/article/e6717d3d-f5fb-467f-866c-0c610c2d4a4e/800.jpeg)
วิธีจัดเตรียมอินเทอร์เฟซแบบรวมที่มีชุดของการใช้งานหรืออินเทอร์เฟซที่แตกต่างกัน ตัวอย่างเช่น กับระบบย่อย หากการมีเพศสัมพันธ์ที่รัดกุมกับระบบย่อยนั้นเป็นสิ่งที่ไม่พึงปรารถนา หรือการนำไปใช้ของระบบย่อยอาจเปลี่ยนแปลงได้อย่างไร
กำหนดจุดหนึ่งของการโต้ตอบกับระบบย่อย - วัตถุส่วนหน้าที่จัดเตรียมส่วนต่อประสานทั่วไปกับระบบย่อย และกำหนดความรับผิดชอบสำหรับการโต้ตอบกับส่วนประกอบต่างๆ ซุ้มเป็นวัตถุภายนอกที่มีจุดเริ่มต้นเดียวสำหรับบริการระบบย่อย
การใช้คอมโพเนนต์ระบบย่อยอื่นๆ เป็นแบบส่วนตัวและคอมโพเนนต์ภายนอกไม่สามารถมองเห็นได้ วัตถุ Facade ให้การดำเนินการตามรูปแบบ GRASP ทนต่อการเปลี่ยนแปลงในแง่ของการป้องกันการเปลี่ยนแปลงในการใช้งานระบบย่อย
สำคัญ! รูปแบบนี้ใช้เมื่อเราต้องการซ่อนกลุ่มของวัตถุทั้งหมดและส่งผ่านการสื่อสารทั้งหมดผ่านวัตถุของเรา หากคุณต้องการให้การควบคุมกระบวนการสื่อสารของอ็อบเจ็กต์บางอย่างและไม่จำเป็นต้องซ่อนมัน จะเป็นการดีกว่าถ้าใช้รูปแบบพร็อกซี