ความแตกต่างระหว่างรูปแบบการออกแบบ Facade, Proxy, Adapter และ Decorator? [ปิด]


137

รูปแบบการออกแบบ Facade, Proxy, Adapter และ Decorator แตกต่างกันอย่างไร

ฉันไม่เคยอ่านคำอธิบายที่ชัดเจนว่าของคุณคืออะไร?



@gavenkoa คำถามอื่นเกี่ยวกับพร็อกซีและมัณฑนากรเท่านั้น
user310291

4
เหลือเชื่อเมื่อคำถามปิดเผยตัวเองมีประโยชน์มาก
ลุค

คำตอบ:


289

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

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

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

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

ตอนนี้คุณมีมัณฑนากรที่เกี่ยวข้องแล้วคุณอาจต้องการทราบว่าเหตุใดจึงเน้นที่วัตถุคำ - บางภาษา (เช่น Java) ไม่อนุญาตให้มีการสืบทอดเสมือน (เช่นการสืบทอดหลายรายการเช่นเดียวกับ C ++) เพื่อให้คุณทำสิ่งนี้ได้ที่ รวบรวมเวลา

เนื่องจากเราได้ลากมรดกหลายรายการ (และเพชรที่น่ากลัว) คุณจะต้องมองหามิกซ์อิน - ซึ่งได้รับคำสั่งให้มีการเชื่อมโยงอินเทอร์เฟซเชิงเส้นเพื่อแก้ไขปัญหาการสืบทอดหลายรายการ อย่างไรก็ตามส่วนผสมไม่ผสมกันดี และเราจบลงด้วยลักษณะ - ใช่กลุ่มพฤติกรรมเล็ก ๆ น้อย ๆ ที่ไร้สัญชาติที่คุณเห็นป๊อปอัปตลอดเวลาในพารามิเตอร์เทมเพลตใน C ++ ลักษณะพยายามที่จะแก้ไขปัญหาขององค์ประกอบและการสลายตัวของพฤติกรรมในลักษณะที่สง่างามในขณะที่ไม่ได้ดำเนินการเพื่อการสืบทอดหลายครั้งหรือการผูกมัดตามลำดับ


1
เฮ้! ฉันพยายามใส่ให้มากที่สุดเท่าที่จะทำได้โดยไม่คลุมเครือเกินไป ขอโทษที่ฉันไม่สามารถทำได้ดีกว่านี้ ฉันได้อ่านเอกสาร (วิทยานิพนธ์ปริญญาเอก) เกี่ยวกับคุณลักษณะเพียงอย่างเดียว ดังนั้นความรู้ของฉันจึงค่อนข้าง จำกัด และฉันไม่ดีพอที่จะปรับให้พอดีกับรูปแบบทั้งหมดในพื้นที่นี้;)
จริงจังเมื่อ

คุณคาดว่าจะมีคำถามในอนาคตเกี่ยวกับมิกซ์อินและลักษณะ แต่ฉันยังไม่เคยเห็น!
user310291

1
ลิงค์เปรียบเทียบที่ดี (ผ่านวิกิพีเดีย) สำหรับสามคนแรก (มัณฑนากรต่างกันมาก): NetObjectives
Liviu

@Liviu ลิงค์ของคุณตายแล้ว ฉันคิดว่าคุณเคยชี้ไปที่นั่นแต่ตอนนี้เนื้อหาดูเหมือนจะอยู่เบื้องหลังการเข้าสู่ระบบ
Jonathan H

@ เชลจอห์นลิงก์อัปเดตแล้ว: p: ลิงก์เปรียบเทียบที่ดี (ผ่านวิกิพีเดีย) สำหรับสามรายการแรก (มัณฑนากรเป็นคนที่แตกต่างกันมาก) NetObjectives (Retreiveing ​​text, see "betweem": "หนึ่งในคำถามที่พบบ่อยในชั้นเรียนคือ" อะไร ความแตกต่างระหว่างอะแดปเตอร์พร็อกซีและ Facade มันดูเหมือนกับฉันจริงๆ ")
Liviu

16

ซุ้ม

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

อะแดปเตอร์

ตัวอย่างที่ดีสามารถพบได้ที่นี่บน Wikipedia อ็อบเจ็กต์ไคลเอ็นต์Sourceต้องการเรียกใช้เมธอดบนอ็อบเจ็กต์อื่นTargetแต่อินเทอร์เฟซของอ็อบเจ็กต์อื่นแตกต่างจากที่ไคลเอ็นต์คาดหวัง

ป้อนวัตถุอะแด็ปเตอร์

สามารถใช้การโทรจากSourceวัตถุและเบื้องหลังการเรียกใช้Targetเมธอดที่ควรใช้

Source->CallMethodAOnTarget() ---< Adaptor.CallMethodAOnTarget() this calls ---> Target.MethodWithDifferentSignatureAndName(int i)

สำหรับ Proxy ฉันไม่มีประสบการณ์เกี่ยวกับรูปแบบการออกแบบนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.