รูปแบบการออกแบบ Facade, Proxy, Adapter และ Decorator แตกต่างกันอย่างไร
ฉันไม่เคยอ่านคำอธิบายที่ชัดเจนว่าของคุณคืออะไร?
รูปแบบการออกแบบ Facade, Proxy, Adapter และ Decorator แตกต่างกันอย่างไร
ฉันไม่เคยอ่านคำอธิบายที่ชัดเจนว่าของคุณคืออะไร?
คำตอบ:
อะแด็ปเตอร์ปรับคลาส / อ็อบเจ็กต์ที่กำหนดให้กับอินเทอร์เฟซใหม่ ในกรณีของอดีตมักจะใช้มรดกหลายอย่าง ในกรณีหลังนี้วัตถุจะถูกห่อหุ้มด้วยวัตถุอะแดปเตอร์ที่สอดคล้องกันและผ่านไปรอบ ๆ ปัญหาที่เรากำลังแก้ที่นี่เป็นที่ของอินเตอร์เฟซที่เข้ากันไม่ได้
Facadeเปรียบเสมือนประตูสู่ชุดฟังก์ชันที่ซับซ้อน คุณสร้างกล่องดำเพื่อให้ลูกค้าของคุณกังวลน้อยลงเช่นทำให้อินเทอร์เฟซง่ายขึ้น
พร็อกซีมีอินเทอร์เฟซเดียวกับพร็อกซีสำหรับคลาสและโดยทั่วไปจะทำสิ่งดูแลทำความสะอาดด้วยตัวเอง (ดังนั้นแทนที่จะทำให้หลายสำเนาของวัตถุที่หนักX
คุณทำสำเนาของพร็อกซี่ที่มีน้ำหนักเบาP
ซึ่งจะจัดการX
และแปลเป็นสายของคุณจำเป็นต้อง.) คุณจะแก้ปัญหาของลูกค้าจากที่มีการจัดการหนักและ / หรือวัตถุที่ซับซ้อน
Decoratorใช้เพื่อเพิ่มดินปืนให้กับวัตถุของคุณ (สังเกตคำว่าวัตถุ - โดยทั่วไปคุณจะตกแต่งวัตถุแบบไดนามิกในขณะรันไทม์) คุณทำไม่ได้ซ่อน / ทำให้เสียการเชื่อมต่อที่มีอยู่ของวัตถุ แต่เพียงขยายมันที่รันไทม์
ตอนนี้คุณมีมัณฑนากรที่เกี่ยวข้องแล้วคุณอาจต้องการทราบว่าเหตุใดจึงเน้นที่วัตถุคำ - บางภาษา (เช่น Java) ไม่อนุญาตให้มีการสืบทอดเสมือน (เช่นการสืบทอดหลายรายการเช่นเดียวกับ C ++) เพื่อให้คุณทำสิ่งนี้ได้ที่ รวบรวมเวลา
เนื่องจากเราได้ลากมรดกหลายรายการ (และเพชรที่น่ากลัว) คุณจะต้องมองหามิกซ์อิน - ซึ่งได้รับคำสั่งให้มีการเชื่อมโยงอินเทอร์เฟซเชิงเส้นเพื่อแก้ไขปัญหาการสืบทอดหลายรายการ อย่างไรก็ตามส่วนผสมไม่ผสมกันดี และเราจบลงด้วยลักษณะ - ใช่กลุ่มพฤติกรรมเล็ก ๆ น้อย ๆ ที่ไร้สัญชาติที่คุณเห็นป๊อปอัปตลอดเวลาในพารามิเตอร์เทมเพลตใน C ++ ลักษณะพยายามที่จะแก้ไขปัญหาขององค์ประกอบและการสลายตัวของพฤติกรรมในลักษณะที่สง่างามในขณะที่ไม่ได้ดำเนินการเพื่อการสืบทอดหลายครั้งหรือการผูกมัดตามลำดับ
ซุ้ม
คุณสามารถใช้ส่วนหน้าเพื่อโทรไปยัง API ได้ง่ายขึ้น ลองดูที่นี้ตัวอย่างของซุ้มระยะไกล แนวคิดก็คือการนำโค้ดไปใช้งานทั้งหมดบนเซิร์ฟเวอร์ถูกซ่อนไว้ไม่ให้ไคลเอนต์ ไคลเอนต์เรียก 1 เมธอด API ซึ่งในทางกลับกันสามารถทำการเรียก API 1 รายการขึ้นไปบนเซิร์ฟเวอร์
อะแดปเตอร์
ตัวอย่างที่ดีสามารถพบได้ที่นี่บน Wikipedia อ็อบเจ็กต์ไคลเอ็นต์Source
ต้องการเรียกใช้เมธอดบนอ็อบเจ็กต์อื่นTarget
แต่อินเทอร์เฟซของอ็อบเจ็กต์อื่นแตกต่างจากที่ไคลเอ็นต์คาดหวัง
ป้อนวัตถุอะแด็ปเตอร์
สามารถใช้การโทรจากSource
วัตถุและเบื้องหลังการเรียกใช้Target
เมธอดที่ควรใช้
Source->CallMethodAOnTarget() ---< Adaptor.CallMethodAOnTarget() this calls ---> Target.MethodWithDifferentSignatureAndName(int i)
สำหรับ Proxy ฉันไม่มีประสบการณ์เกี่ยวกับรูปแบบการออกแบบนี้