ฉันอ่านบทความการเขียนโปรแกรมและกล่าวถึงรูปแบบของมัณฑนากร ฉันเขียนโปรแกรมมาซักพัก แต่ไม่มีการศึกษาหรือการฝึกอบรมอย่างเป็นทางการ แต่ฉันพยายามเรียนรู้เกี่ยวกับรูปแบบมาตรฐานและเช่นนั้น
ดังนั้นฉันจึงค้นหามัณฑนากรและพบบทความ Wikipediaอยู่ ตอนนี้ฉันเข้าใจแนวคิดของรูปแบบมัณฑนากร แต่ตอนนี้ฉันสับสนเล็กน้อย:
ยกตัวอย่างเช่นพิจารณาหน้าต่างในระบบหน้าต่าง ในการอนุญาตให้เลื่อนเนื้อหาของหน้าต่างเราอาจต้องการเพิ่มแถบเลื่อนแนวนอนหรือแนวตั้งลงตามความเหมาะสม สมมติว่าหน้าต่างแสดงโดยอินสแตนซ์ของคลาสหน้าต่างและสมมติว่าคลาสนี้ไม่มีฟังก์ชันการทำงานสำหรับการเพิ่มแถบเลื่อน เราสามารถสร้างคลาสย่อย ScrollingWindow ที่จัดเตรียมไว้หรือเราสามารถสร้าง ScrollingWindowDecorator ที่เพิ่มฟังก์ชันนี้ให้กับวัตถุหน้าต่างที่มีอยู่ ณ จุดนี้การแก้ปัญหาอย่างใดอย่างหนึ่งจะดี
ทีนี้สมมติว่าเราต้องการความสามารถในการเพิ่มเส้นขอบให้กับหน้าต่างของเราด้วย คลาส Window ดั้งเดิมของเราไม่สนับสนุน ขณะนี้คลาสย่อย ScrollingWindow มีปัญหาเนื่องจากได้สร้างหน้าต่างชนิดใหม่อย่างมีประสิทธิภาพ หากเราต้องการเพิ่มการรองรับชายแดนให้กับหน้าต่างทั้งหมดเราต้องสร้างคลาสย่อย WindowWithBorder และ ScrollingWindowWithBorder เห็นได้ชัดว่าปัญหานี้แย่ลงเมื่อมีการเพิ่มคุณสมบัติใหม่ทุกอย่าง สำหรับโซลูชันมัณฑนากรเราเพียงสร้าง BorderedWindowDecorator ใหม่ - ที่รันไทม์เราสามารถตกแต่งหน้าต่างที่มีอยู่ด้วย ScrollingWindowDecorator หรือ BorderedWindowDecorator หรือทั้งสองอย่างตามที่เราเห็นสมควร
ตกลงเมื่อพวกเขาบอกว่าจะเพิ่มเส้นขอบให้กับหน้าต่างทั้งหมดทำไมไม่เพียงเพิ่มฟังก์ชันการทำงานลงในคลาสหน้าต่างดั้งเดิมเพื่ออนุญาตให้มีตัวเลือก วิธีที่ฉันเห็นคือ subclassing เป็นเพียงการเพิ่มฟังก์ชั่นเฉพาะให้กับคลาสหรือแทนที่เมธอดคลาส หากฉันต้องการเพิ่มฟังก์ชันการทำงานให้กับวัตถุที่มีอยู่ทั้งหมดเหตุใดฉันจึงไม่ปรับเปลี่ยน superclass ให้ทำเช่นนั้น
มีอีกบรรทัดในบทความ:
รูปแบบมัณฑนากรเป็นอีกทางเลือกหนึ่งของการทำคลาสย่อย การจัดคลาสย่อยเพิ่มลักษณะการทำงาน ณ เวลารวบรวมและการเปลี่ยนแปลงมีผลต่ออินสแตนซ์ทั้งหมดของคลาสดั้งเดิม การตกแต่งสามารถให้พฤติกรรมใหม่ในเวลาทำงานสำหรับแต่ละวัตถุ
ฉันไม่เข้าใจว่าพวกเขาพูดว่า "... การเปลี่ยนแปลงส่งผลกระทบต่ออินสแตนซ์ทั้งหมดของคลาสดั้งเดิม" - คลาสย่อยเปลี่ยนแปลงคลาสแม่ได้อย่างไร นั่นคือจุดรวมของคลาสย่อยหรือไม่?
ฉันจะสมมติว่าบทความเช่นเดียวกับ Wiki หลาย ๆ อันนั้นไม่ได้เขียนไว้อย่างชัดเจน ฉันสามารถเห็นประโยชน์ของมัณฑนากรในบรรทัดสุดท้าย - "... แสดงพฤติกรรมใหม่ในเวลาทำงานสำหรับแต่ละวัตถุ"
โดยไม่ต้องอ่านเกี่ยวกับรูปแบบนี้ถ้าฉันต้องการเปลี่ยนพฤติกรรมในเวลาทำงานสำหรับแต่ละวัตถุฉันอาจจะสร้างวิธีการบางอย่างใน super- หรือ subclass เพื่อเปิด / ปิดพฤติกรรมดังกล่าว โปรดช่วยฉันเข้าใจถึงประโยชน์ของมัณฑนากรเป็นอย่างมากและทำไมความคิดใหม่ของฉันจึงมีข้อบกพร่อง