แน่นอน แต่เราเรียกองค์ประกอบและการมอบหมายนั้น รูปแบบกลยุทธ์และการพึ่งพาการฉีดอาจดูเหมือนคล้ายกันกับโครงสร้าง แต่เจตนาของพวกเขานั้นแตกต่างกัน
รูปแบบกลยุทธ์ช่วยให้สามารถปรับเปลี่ยนการทำงานของรันไทม์ภายใต้อินเทอร์เฟซเดียวกันได้ ฉันบอกเป็ดเป็ดบินได้และดูมันบินไปพร้อมกับปีก จากนั้นเปลี่ยนเป็นเป็ดนักบินเจ็ทและดูมันบินกับสายการบินเดลต้า การทำเช่นนั้นในขณะที่โปรแกรมกำลังทำงานอยู่เป็นรูปแบบกลยุทธ์
การพึ่งพาการฉีดเป็นเทคนิคเพื่อหลีกเลี่ยงการพึ่งพาการเข้ารหัสยากเพื่อให้พวกเขาสามารถเปลี่ยนแปลงได้อย่างอิสระโดยไม่ต้องมีลูกค้าที่จะแก้ไขเมื่อพวกเขาเปลี่ยน ลูกค้าเพียงแค่แสดงความต้องการของพวกเขาโดยไม่ทราบว่าพวกเขาจะได้พบกับ ดังนั้นวิธีการที่พวกเขาพบกันมีการตัดสินใจที่อื่น ๆ (โดยทั่วไปในหลัก) คุณไม่ต้องการเป็ดสองตัวเพื่อใช้ประโยชน์จากเทคนิคนี้ สิ่งที่ใช้เป็ดโดยไม่ต้องรู้หรือดูแลเป็ดตัวไหน สิ่งที่ไม่ได้สร้างเป็ดหรือไปหามัน แต่มีความสุขอย่างสมบูรณ์แบบที่จะใช้สิ่งที่คุณเป็ดมันมือ
ถ้าฉันมีคลาสเป็ดที่เป็นรูปธรรมฉันสามารถใช้มันให้เป็นพฤติกรรมการบินได้ ฉันยังสามารถให้มันสลับพฤติกรรมจาก fly-with-wing เป็น fly-with-Delta ตามตัวแปรสถานะ ตัวแปรนั้นอาจเป็นบูลีน, int หรืออาจเป็นวิธีFlyBehavior
ที่มีfly
รูปแบบการบินใด ๆ โดยที่ฉันไม่ต้องทดสอบด้วยถ้า ตอนนี้ฉันสามารถเปลี่ยนรูปแบบการบินได้โดยไม่ต้องเปลี่ยนประเภทเป็ด ตอนนี้ Mallards สามารถกลายเป็นนักบิน นี่คือองค์ประกอบและคณะผู้แทน เป็ดประกอบด้วย FlyBehavior และสามารถมอบหมายการบินให้กับมันได้ คุณสามารถแทนที่พฤติกรรมเป็ดทั้งหมดของคุณในคราวนี้ด้วยวิธีนี้หรือถือบางสิ่งบางอย่างสำหรับแต่ละพฤติกรรมหรือการรวมกันในระหว่าง
สิ่งนี้ให้พลังทั้งหมดเดียวกับที่สืบทอดได้ยกเว้นหนึ่ง การสืบทอดช่วยให้คุณสามารถแสดงวิธีการ Duck ที่คุณกำลังเอาชนะใน Duck subtypes องค์ประกอบและการมอบหมายต้องการเป็ดเพื่อมอบหมายอย่างชัดเจนให้ย่อยจากจุดเริ่มต้น มันมีความยืดหยุ่นมากกว่า แต่มันเกี่ยวข้องกับการพิมพ์บนแป้นพิมพ์มากกว่าและ Duck ต้องรู้ว่ามันกำลังเกิดขึ้น
อย่างไรก็ตามหลายคนเชื่อว่าการสืบทอดต้องได้รับการออกแบบมาอย่างชัดเจนตั้งแต่ต้น และหากยังไม่ได้รับการคุณควรทำเครื่องหมายชั้นเรียนของคุณเป็นปิดผนึก / ครั้งสุดท้ายเพื่อไม่อนุญาตให้สืบทอด หากคุณรับมุมมองนั้นการรับมรดกไม่มีประโยชน์จากการจัดองค์ประกอบและการมอบหมาย เพราะอย่างใดอย่างหนึ่งคุณต้องออกแบบเพื่อขยายตั้งแต่เริ่มต้นหรือเต็มใจที่จะฉีกในภายหลัง
การรื้อสิ่งต่าง ๆ ลงมาเป็นตัวเลือกยอดนิยม เพิ่งทราบว่ามีหลายกรณีที่เกิดปัญหา หากคุณปรับใช้ไลบรารีหรือโมดูลโค้ดอย่างอิสระซึ่งคุณไม่ต้องการอัปเดตด้วยการเปิดตัวครั้งถัดไปคุณสามารถลงเอยด้วยการจัดการกับเวอร์ชันของคลาสที่ไม่รู้อะไรเลยเกี่ยวกับสิ่งที่คุณทำอยู่ตอนนี้
ในขณะที่ยินดีที่จะฉีกสิ่งต่อมาสามารถปลดปล่อยคุณจากการออกแบบมากกว่ามีบางสิ่งที่ทรงพลังมากเกี่ยวกับความสามารถในการออกแบบสิ่งที่ใช้เป็ดโดยไม่ต้องรู้ว่าเป็ดจะทำอะไรเมื่อใช้จริง ที่ไม่ทราบว่าเป็นสิ่งที่ทรงพลัง มันช่วยให้คุณหยุดคิดถึงเป็ดสักครู่และคิดถึงรหัสที่เหลือของคุณ
"เรา" และ "เราควร" เป็นคำถามที่แตกต่างกันหรือไม่ องค์ประกอบที่โปรดปรานเหนือมรดกไม่ได้บอกว่าจะไม่ใช้มรดก ยังมีบางกรณีที่การถ่ายทอดทางพันธุกรรมมีความหมายมากที่สุด ฉันจะแสดงตัวอย่างที่ฉันชอบ :
public class LoginFailure : System.ApplicationException {}
การสืบทอดช่วยให้คุณสร้างข้อยกเว้นด้วยชื่อที่มีความหมายที่เฉพาะเจาะจงมากขึ้นในหนึ่งบรรทัดเท่านั้น
ลองทำด้วยองค์ประกอบและคุณจะได้รับความยุ่งเหยิง นอกจากนี้ยังไม่มีความเสี่ยงของปัญหาการสืบทอดโยโย่เนื่องจากไม่มีข้อมูลหรือวิธีการที่นี่เพื่อนำมาใช้ซ้ำและส่งเสริมการผูกมัดมรดก ทั้งหมดนี้เพิ่มเป็นชื่อที่ดี อย่าประมาทคุณค่าของชื่อที่ดี
Duckbehavior.quackBehavior
และเขตข้อมูลอื่น ๆ ในรหัสของคุณคืออะไร