โหมดกลยุทธ์ของการเขียนโปรแกรมโหมด Delphi
หลิวยี่
1.1 คำอธิบายโหมด
วัตถุประสงค์ของรูปแบบกลยุทธ์คือการกำหนดชุดของอัลกอริธึมและสรุปอัลกอริธึมแต่ละอัลกอริธึมให้เป็นคลาสอิสระที่มีอินเทอร์เฟซทั่วไปเพื่อให้สามารถแทนที่ซึ่งกันและกันได้ รูปแบบกลยุทธ์ช่วยให้สามารถเปลี่ยนแปลงอัลกอริธึมได้โดยอิสระจากไคลเอนต์ที่ใช้งาน เพื่อให้เข้าใจถึงแรงจูงใจและความสำคัญของการใช้รูปแบบกลยุทธ์ เราต้องเริ่มต้นด้วยตัวอย่างที่น่าสนใจ ในระบบการจัดการวัสดุ โมดูลขาออกและขาเข้าเป็นส่วนหลักของระบบ (เราจะใช้ขาออกเป็นตัวอย่างสำหรับการวิเคราะห์ด้านล่าง) สำหรับโปรแกรมเมอร์ที่ไม่มีประสบการณ์ในการเขียนโปรแกรมเชิงวัตถุ พวกเขามักจะใส่ตรรกะทั้งหมดของคำสั่งซื้อขาออกบนไคลเอนต์ (อินเทอร์เฟซการสั่งซื้อของร้าน) และใช้คำสั่งย่อยแบบมีเงื่อนไขบนไคลเอนต์เพื่อพิจารณาว่าประเภทคำสั่งซื้อขาออกกำลังเลือกอยู่หรือไม่ ยืมวัสดุหรือรายงานการขาดทุน เพื่อเลือกวิธีการชำระขาออกต่างๆ ดังแสดงในรูปที่ 1-1 ส่งผลให้โค้ดของลูกค้ามีความซับซ้อนและยากต่อการดูแลรักษา ตัวอย่างเช่น: เมื่อคุณต้องการเพิ่มประเภทใบสั่งโอนใหม่ออกจากคลังสินค้า คุณต้องแก้ไขเงื่อนไขการตัดสิน คอมไพล์ใหม่และเผยแพร่ไคลเอ็นต์ เมื่อสถานการณ์มีความซับซ้อนมากขึ้นเรื่อยๆ ก็จะมีสาขาที่มีเงื่อนไขมากขึ้นเรื่อยๆ และจะมีการเพิ่มรหัสโปรแกรมมากขึ้นเรื่อยๆ ซึ่งจะทำให้ไคลเอนต์มีขนาดใหญ่ขึ้นและยากต่อการบำรุงรักษา และความเป็นไปได้ที่จะมีอิทธิพลและข้อผิดพลาดร่วมกันก็จะเพิ่มขึ้น . รูปที่ 1-1 โมดูลขาออกที่ออกแบบตามการคิดเชิงกระบวนการ หากวิเคราะห์โดยใช้การคิดเชิงวัตถุ รายการหยิบ รายการยืม และรายงานการสูญเสียสามารถถือเป็นคลาสที่ได้รับของบันทึกขาออก ดังแสดงในรูปที่ 1- 2 แสดง ด้วยวิธีนี้ เอกสารขาออกจะทำหน้าที่เป็นคลาสฐานเอกสารเพื่อจัดเตรียมอินเทอร์เฟซทั่วไปสำหรับเอกสาร และการสืบทอดจะใช้เพื่อปรับใช้พฤติกรรมขาออกที่แตกต่างกันในคลาสย่อย สิ่งนี้ใช้ประโยชน์จากแนวคิดที่สำคัญในเชิงวัตถุ: ความหลากหลาย อย่างไรก็ตาม การออกแบบนี้ยังมีข้อบกพร่องอยู่ นั่นคือสภาพแวดล้อมและพฤติกรรมมีความเชื่อมโยงกันอย่างใกล้ชิด กล่าวอีกนัยหนึ่ง เอกสารและอัลกอริธึมขาออกเฉพาะจะเชื่อมโยงกันอย่างใกล้ชิด การมีเพศสัมพันธ์ที่แข็งแกร่งจะป้องกันไม่ให้ทั้งสองพัฒนาอย่างเป็นอิสระต่อกัน ซึ่งจำกัดการนำกลับมาใช้ใหม่และความสามารถในการขยายขนาด รูปที่ 1-3 คือโมดูลขาออกที่ออกแบบใหม่โดยใช้รูปแบบกลยุทธ์ ออบเจ็กต์เอกสารขาออกอ้างอิงถึงออบเจ็กต์นโยบายขาออกผ่านออบเจ็กต์การดำเนินการขาออก (เช่น บริบทในโหมดกลยุทธ์) กลยุทธ์ขาออกเฉพาะต่างๆ ถูกนำมาใช้โดยคลาสที่ได้รับมาจากคลาสกลยุทธ์ขาออก เอกสารขาออกสามารถจัดเตรียมวิธีการชำระขาออกและอินเทอร์เฟซการแสดงเอกสารตามการดำเนินการขาออกและรูปแบบเอกสารตามลำดับ ด้วยวิธีนี้ โหมดกลยุทธ์จะแยกพฤติกรรมขาออกจากสภาพแวดล้อมของเอกสารขาออก และการเพิ่มขึ้น ลด หรือการปรับเปลี่ยนอัลกอริทึมขาออกจะไม่ส่งผลกระทบต่อสภาพแวดล้อมและไคลเอนต์ รูปที่ 1-2 โมดูลขาออกได้รับการออกแบบตามการคิดเชิงวัตถุ รูปที่ 1-3 โมดูลขาออกได้รับการออกแบบตามการคิดรูปแบบการออกแบบ ข้อดีของรูปแบบกลยุทธ์คือการแยกอัลกอริทึมและสภาพแวดล้อม และทั้งสองสามารถพัฒนาได้อย่างอิสระ เพื่อแสดงให้เห็นประโยชน์ของการแยกอัลกอริธึมและสภาพแวดล้อมได้ดีขึ้น เราอาจพิจารณาการออกแบบในรูปที่ 1-4 ด้วยเช่นกัน ในการออกแบบนี้ ไม่มีแนวคิดเกี่ยวกับโมดูลขาออกและขาเข้า เนื่องจากฉันสรุปเอกสารขาออก/ขาเข้าทั้งหมด และรวมอินเทอร์เฟซและลักษณะการทำงานของเอกสารแบบไดนามิกระหว่างรันไทม์ ผ่านคลาสการดำเนินการขาออก/ขาเข้า คลาสพฤติกรรมที่แตกต่างกันสามารถรักษา สอบถาม และกำหนดค่าได้ พฤติกรรมขาออก/ขาเข้าที่เป็นนามธรรมสรุปอัลกอริธึมที่สอดคล้องกันในรูปแบบของคลาสกลยุทธ์เพื่อดำเนินการกับเอกสารขาเข้าและขาออกประเภทต่างๆ ให้เสร็จสมบูรณ์ สิ่งนี้ช่วยเพิ่มความสามารถในการนำกลับมาใช้ใหม่และความสามารถในการปรับขนาดของระบบได้อย่างเห็นได้ชัด และลดความยากลำบากในการบำรุงรักษา รูปที่ 1-4 ข้อดีของรูปแบบกลยุทธ์คือการแยกอัลกอริธึมและสภาพแวดล้อมออกจากกัน จะเห็นได้ว่ารูปแบบกลยุทธ์เหมาะสำหรับสถานการณ์ต่อไปนี้: · เมื่อความแตกต่างระหว่างคลาสที่เกี่ยวข้องจำนวนมากอยู่ ในพฤติกรรมของพวกเขาเท่านั้น รูปแบบกลยุทธ์ช่วยให้ออบเจ็กต์สามารถเลือกพฤติกรรมหนึ่งอย่างแบบไดนามิกได้ · เมื่อมีอัลกอริธึมทางเลือกมากมายเพื่อให้บรรลุเป้าหมาย เช่น อัลกอริธึมที่คุณกำหนดตามข้อดีข้อเสียที่แตกต่างกัน (เช่น การใช้กลยุทธ์ที่แตกต่างกัน) อัลกอริธึมเฉพาะเหล่านี้สามารถห่อหุ้มไว้ในคลาสที่ได้รับของคลาสอัลกอริธึมนามธรรม และเพลิดเพลินกับอินเทอร์เฟซแบบรวมของคลาสอัลกอริธึมนามธรรม ด้วยความหลากหลาย ลูกค้าสามารถเลือกอัลกอริธึมเฉพาะใดๆ ก็ได้ ตราบใดที่มันเก็บอ็อบเจ็กต์ของคลาสอัลกอริธึมแบบนามธรรม · เมื่ออัลกอริทึมใช้ข้อมูลที่ไม่สามารถใช้ได้กับไคลเอนต์ การใช้รูปแบบกลยุทธ์หลีกเลี่ยงการเปิดเผยโครงสร้างข้อมูลที่เกี่ยวข้องกับอัลกอริทึมที่ซับซ้อน ในความเป็นจริง ลูกค้าไม่จำเป็นต้องรู้ความรู้และข้อมูลที่เกี่ยวข้องกับอัลกอริทึม · เมื่อคำจำกัดความของคลาสมีพฤติกรรมมากมายและมีการใช้ข้อความสั่งแบบมีเงื่อนไขหลายคำเพื่อพิจารณาการเลือกพฤติกรรมเหล่านี้ รูปแบบกลยุทธ์สามารถถ่ายโอนพฤติกรรมเหล่านี้ไปยังคลาสกลยุทธ์เฉพาะที่สอดคล้องกัน จึงหลีกเลี่ยงการเลือกเงื่อนไขหลายรายการที่ยากต่อการรักษา และรวบรวมแนวคิดการเขียนโปรแกรมเชิงวัตถุ
1.2 โครงสร้างและการใช้งาน
โครงสร้างของรูปแบบกลยุทธ์แสดงในรูปที่ 1-5 ซึ่งรวมถึงผู้เข้าร่วมดังต่อไปนี้: · กลยุทธ์เชิงนามธรรม (TStrategy) - ประกาศอินเทอร์เฟซทั่วไปสำหรับอัลกอริธึมที่รองรับทั้งหมด TContext ใช้อินเทอร์เฟซนี้เพื่อเรียกอัลกอริทึมที่กำหนดและห่อหุ้มโดย TConcreteStrategy · กลยุทธ์ที่เป็นรูปธรรม (TConcreteStrategy) - สรุปอัลกอริธึมหรือพฤติกรรมเฉพาะ ใช้อินเทอร์เฟซ TStrategy · บริบท (TContext) – มีการอ้างอิงถึง TStrategy เรียกใช้อินเทอร์เฟซ TStrategy เพื่อกำหนดค่าอัลกอริทึมหรือพฤติกรรมเฉพาะแบบไดนามิก รูปที่ 1-5 โครงสร้างของรูปแบบกลยุทธ์ ในรูปแบบกลยุทธ์ อัลกอริธึมที่เลือกจะถูกนำไปใช้ผ่านการโต้ตอบของ TStrategy และ TContext เมื่ออัลกอริทึมถูกเรียก TContext จะสามารถส่งข้อมูลทั้งหมดที่อัลกอริทึมต้องการไปยัง TStrategy หรืออีกวิธีหนึ่ง TContext สามารถส่งผ่านตัวเองเป็นพารามิเตอร์ไปยังการดำเนินการ TStrategy ได้ เมื่อ TContext ส่งต่อคำขอไคลเอ็นต์ไปยัง TStrategy โดยทั่วไปไคลเอ็นต์จะสร้างและส่งวัตถุ TConcreteStrategy ไปยัง TContext ด้วยวิธีนี้ไคลเอ็นต์จะโต้ตอบกับ TContext เท่านั้น โดยปกติแล้วจะมีคลาส TConcreteStrategy หลายคลาสที่ลูกค้าสามารถเลือกได้ -------------------------------------------------- -------------------------------------------------- --------------------------------------------
บทความที่เกี่ยวข้องเพิ่มเติมและซอร์สโค้ดโปรแกรมตัวอย่างสามารถดาวน์โหลดได้จากเว็บไซต์ของผู้เขียน: http://www.liu-yi.net