โหมดกลยุทธ์
ต้นทาง
โหมดกลยุทธ์ของ Delphi ได้รับการขยายบนพื้นฐานของกลยุทธ์ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับโหมดกลยุทธ์ โปรดดูที่ "รูปแบบการออกแบบ หน้า 208"
วัตถุประสงค์
กำหนดชุดของอัลกอริธึม ห่อหุ้มทีละชุด และทำให้สามารถใช้แทนกันได้ รูปแบบนี้ทำให้อัลกอริธึมเป็นอิสระจากการเปลี่ยนแปลงในไคลเอนต์ที่ใช้งาน
แรงจูงใจ
? กลยุทธ์ที่แตกต่างกันสามารถเปลี่ยนแบบไดนามิกได้ตามต้องการ ? สรุปพฤติกรรมและโครงสร้างอัลกอริธึมหลายอย่างได้ดีขึ้นโดยไม่ปล่อยให้โปรแกรมไคลเอนต์รบกวนโดยตรง? วิธี
การเทมเพลต ใช้การสืบทอดเพื่อแปลงส่วนของอัลกอริทึม กลยุทธ์ใช้พรอกซีและการรวมกันเพื่อแปลงอัลกอริทึมทั้งหมดและสนับสนุนการแปลงแบบไดนามิก ในอนาคต ออบเจ็กต์บริบทจะถูกใช้เพื่อจัดสรรอัลกอริธึมเฉพาะแบบไดนามิกขณะรันไทม์ ในทำนองเดียวกัน โดยใช้วัตถุบริบท คลาสไคลเอ็นต์จะถูกแยกออกจากอินเทอร์เฟซของอัลกอริทึมที่ขึ้นต่อกัน และสามารถจัดเตรียมอินเทอร์เฟซทั่วไปเพิ่มเติมผ่านวัตถุบริบทได้ ในแง่เดียวกัน ผ่าน
อินเทอร์เฟซบริบท และ
กลยุทธ์ อัลกอริ ธึมที่เกี่ยวข้องกับทั้งระบบสามารถออกแบบและจัดเตรียมได้ในอนาคตเพื่อใช้งานแอปพลิเคชันเฉพาะโดยไม่ต้องเปลี่ยนอินเทอร์เฟซ
กลยุทธ์ ยังช่วยให้คุณสร้างเฟรมเวิร์กคลาสเดียวที่เรียบง่ายและบำรุงรักษาได้ กรอบงานคลาสขึ้นอยู่กับการสืบทอด
แอปพลิเคชัน
การนำไปปฏิบัติ
ตัวอย่างต่อไปนี้จะคำนวณอัตราดอกเบี้ยรายเดือนสำหรับบัตรเครดิต
โหมด กลยุทธ์ ห่อหุ้มและเข้าถึงอินเทอร์เฟซผ่านคลาสนามธรรมที่เป็นเอกลักษณ์ TfinanzeCharge และมีอัลกอริธึมที่แตกต่างกันในการคำนวณอัตราดอกเบี้ยรายเดือน TregularCharge และ TPReferredCharge สรุปอัลกอริธึมเฉพาะที่แตกต่างกันสำหรับการคำนวณอัตราดอกเบี้ยรายเดือนของบัตรเครดิต TmonthlyCharge ใช้อินเทอร์เฟซ TcontextCharge และกำหนดค่าออบเจ็กต์นโยบายที่แตกต่างกัน TconntextCharge กลายเป็นกลไกกองกลางของออบเจ็กต์ไคลเอนต์และออบเจ็กต์กลยุทธ์ ซึ่งช่วยลดการพึ่งพาออบเจ็กต์ไคลเอนต์และกลยุทธ์/ออบเจ็กต์
// อินเทอร์เฟซกลยุทธ์ ( คลาสนามธรรม) TFinanzeCharge = คลาสสาธารณะ // ส่งคืนฟังก์ชันผลลัพธ์ที่คำนวณได้ getCharge (const Balance
: double ): สองเท่า; เสมือน; end;
// ยอดคงเหลือ: คู่): แทนที่ ;
// กลยุทธ์เฉพาะ TPreferredCharge = คลาส (TFinanzeCharge)
ฟังก์ชั่นสาธารณะ getCharge (const ยอดคงเหลือ: สองครั้ง); end;โปรแกรมไคลเอนต์อาศัยอินเทอร์เฟซบริบทเพื่อกำหนดเวลากลยุทธ์ที่ระบุ อย่างไรก็ตาม เนื่องจากอินเทอร์เฟซบริบทถูกสร้างขึ้นสำหรับโปรแกรมไคลเอนต์ โปรแกรมไคลเอนต์จะต้องทราบนโยบาย/อ็อบเจ็กต์ที่มีอยู่ หากบริบทไม่สามารถส่งคืนอินสแตนซ์ที่ถูกต้อง คุณสามารถเลือกวิธีการใช้งานด้วยกลยุทธ์เริ่มต้นได้
// อินเทอร์เฟซบริบท TChargeContext =
ฟังก์ชันสาธารณะของคลาส ComputeCharges(const Balance: double): double; abstract ; end ;
// คลาส
บริบทเฉพาะ TmonthlyCharges ทำหน้าที่เป็นกลไกกองกลางสำหรับวัตถุไคลเอนต์และวัตถุกลยุทธ์และถูกส่งผ่านใน ตัวสร้าง มีการตั้งค่าอินสแตนซ์การคำนวณอัตราดอกเบี้ยเฉพาะไว้แล้ว
คลาสนี้ทำหน้าที่เป็นตัวกลางระหว่างลูกค้าและคลาสกลยุทธ์ และได้รับการกำหนดค่าโดยใช้องค์ประกอบและส่งผ่านอินสแตนซ์ของค่าใช้จ่ายทางการเงินที่เป็นรูปธรรมในตัวสร้าง
TMonthlyCharges = คลาส (TChargeContext) ส่วนตัว FFinanzeCharge; public//
ฟังก์ชันอินเทอร์เฟซที่เข้าถึงโดยโปรแกรมไคลเอนต์ ComputeCharges (const Balance: double; override; // Constructor กำหนดค่า Constructor ของวัตถุบริบท ) ทำลาย; แทนที่; สิ้นสุด;---การใช้งาน
// ฟังก์ชัน TRegularCharge TRegularCharge.getCharge(const Balance: double): double;begin result := Balance * (REG_RATE / 12);end;
// ฟังก์ชัน TPreferredCharge TPreferredCharge.getCharge(const Balance: double): double;begin // สิ่งนี้อาจซับซ้อน อัลกอริทึมที่คำนึงถึง // รูปแบบการซื้อ
ของ ผู้ถือบัตรเครดิตและคะแนนสะสม ผลลัพธ์ := ยอดคงเหลือ * (PREFERRED_RATE / 12);end;
บริบท // ตัวสร้าง TMonthlyCharges TMonthlyCharges.Create(aFinanzeCharge: TFinanzeCharge);begin inherited Create; // aFinanzeCharge กำหนดค่าวัตถุบริบท // คลาสนี้รับสิทธิ์การเป็นเจ้าของ aFinanzeCharge (จะทำลายมัน) FFinanzeCharge := aFinanzeCharge;end;destructor TMonthlyCharges.Destroy; เริ่มต้น FFinanzeCharge.Free; ทำลาย;สิ้นสุด;ฟังก์ชัน TMonthlyCharges.ComputeCharges(const Balance: double): double;begin result := FFinanzeCharge.getCharge(Balance);end;
ตัวอย่างของ เดลฟี