อะไรคือความแตกต่างระหว่างรูปแบบการออกแบบกลยุทธ์และรูปแบบการออกแบบของรัฐ? ฉันกำลังอ่านบทความไม่กี่เรื่องบนเว็บ แต่ไม่สามารถบอกความแตกต่างได้อย่างชัดเจน
ใครช่วยอธิบายความแตกต่างในเงื่อนไขของคนธรรมดาได้มั้ย
อะไรคือความแตกต่างระหว่างรูปแบบการออกแบบกลยุทธ์และรูปแบบการออกแบบของรัฐ? ฉันกำลังอ่านบทความไม่กี่เรื่องบนเว็บ แต่ไม่สามารถบอกความแตกต่างได้อย่างชัดเจน
ใครช่วยอธิบายความแตกต่างในเงื่อนไขของคนธรรมดาได้มั้ย
คำตอบ:
จริง ๆ แล้วทั้งสองรูปแบบมีความคล้ายคลึงกันในทางปฏิบัติและความแตกต่างระหว่างทั้งสองมีแนวโน้มที่จะแตกต่างกันไปตามที่คุณถาม ตัวเลือกยอดนิยมบางประการ ได้แก่ :
การใช้งาน "แบบคลาสสิก" จะจับคู่ทั้งรัฐหรือกลยุทธ์สำหรับทุกรายการในรายการ แต่คุณจะวิ่งข้ามลูกผสมที่มีทั้งสองอย่างผสมกัน ไม่ว่าคนใดคนหนึ่งจะเป็นรัฐ -Y หรือ Strategy-y มากกว่านี้เป็นคำถามเชิงอัตวิสัย
getStatus()
วิธีการที่จะคืนสถานะที่แตกต่างกันตามสถานะของวัตถุ แต่ผู้เรียกใช้ของวิธีนั้นไม่จำเป็นต้องถูกเข้ารหัสแตกต่างกันไปยังบัญชีสำหรับแต่ละรัฐที่มีศักยภาพความแตกต่างอยู่ที่พวกเขาแก้ปัญหาต่าง ๆ :
โครงสร้างสำหรับการบรรลุเป้าหมายที่แตกต่างกันเหล่านี้มีความคล้ายคลึงกันมาก ทั้งสองรูปแบบเป็นตัวอย่างของการแต่งเพลงพร้อมการมอบสิทธิ์
ข้อสังเกตบางประการเกี่ยวกับข้อดี:
โดยใช้รัฐรูปแบบของรัฐที่ถือครอง (บริบท) ชั้นก็โล่งใจจากความรู้ของสิ่งที่รัฐหรือพิมพ์เป็นและสิ่งที่รัฐหรือชนิดที่มีอยู่ ซึ่งหมายความว่าคลาสปฏิบัติตามหลักการออกแบบแบบเปิด (OCP): คลาสถูกปิดสำหรับการเปลี่ยนแปลงในสถานะ / ประเภทที่มี แต่รัฐ / ประเภทนั้นเปิดให้ส่วนขยาย
ด้วยการใช้รูปแบบกลยุทธ์ชั้นเรียนที่ใช้อัลกอริทึม (บริบท) จะถูกปลดออกจากความรู้เกี่ยวกับวิธีการปฏิบัติงานบางอย่าง (- "อัลกอริทึม") กรณีนี้สร้างการยึดมั่นกับ OCP ชั้นถูกปิดสำหรับการเปลี่ยนแปลงเกี่ยวกับวิธีการปฏิบัติงานนี้ แต่การออกแบบเปิดมากเพื่อเพิ่มขั้นตอนวิธีอื่น ๆ สำหรับการแก้งานนี้
สิ่งนี้มีแนวโน้มที่จะปรับปรุงการยึดมั่นในบริบทของคลาสตามหลักการความรับผิดชอบเดี่ยว (SRP) นอกจากนี้อัลกอริทึมจะสามารถใช้งานได้อย่างง่ายดายเพื่อนำมาใช้ใหม่โดยคลาสอื่น ๆ
ใครช่วยอธิบายในแง่ของคนธรรมดาได้มั้ย
รูปแบบการออกแบบไม่ใช่แนวคิด "คนธรรมดา" จริงๆ แต่ฉันจะพยายามทำให้ชัดเจนที่สุด รูปแบบการออกแบบใด ๆ สามารถพิจารณาในสามมิติ:
ลองเปรียบเทียบสถานะและกลยุทธ์
สถานะถูกใช้ในหนึ่งในสองกรณี[GoF book p. 306] :
- พฤติกรรมของวัตถุขึ้นอยู่กับสถานะของมันและมันจะต้องเปลี่ยนพฤติกรรมของมันในเวลาทำงานขึ้นอยู่กับสถานะนั้น
- การดำเนินการมีคำสั่งแบบมีเงื่อนไขจำนวนมากที่ขึ้นอยู่กับสถานะของวัตถุ สถานะนี้มักจะแสดงโดยหนึ่งหรือมากกว่าค่าคงที่ระบุ บ่อยครั้งการดำเนินการหลายอย่างจะมีโครงสร้างที่มีเงื่อนไขเดียวกันนี้ รูปแบบสถานะทำให้แต่ละสาขาของเงื่อนไขเป็นคลาสแยกต่างหาก สิ่งนี้ช่วยให้คุณปฏิบัติต่อสถานะของวัตถุเป็นวัตถุในสิทธิ์ของตนเองซึ่งสามารถแตกต่างจากวัตถุอื่น
หากคุณต้องการให้แน่ใจว่าคุณมีปัญหาแน่นอนรูปแบบรัฐแก้คุณควรจะสามารถในการจำลองรัฐของวัตถุที่ใช้เครื่องจักรสถานะ จำกัด คุณสามารถค้นหาตัวอย่างที่นำมาใช้ที่นี่
การเปลี่ยนสถานะแต่ละครั้งเป็นวิธีการในส่วนต่อประสานสถานะ นี่ก็หมายความว่าสำหรับการออกแบบคุณจะต้องแน่ใจเกี่ยวกับการเปลี่ยนสถานะก่อนที่คุณจะใช้รูปแบบนี้ มิฉะนั้นถ้าคุณเพิ่มหรือลบการเปลี่ยนมันจะต้องเปลี่ยนอินเตอร์เฟซและชั้นเรียนทั้งหมดที่ใช้มัน
ฉันเองไม่พบรูปแบบนี้ที่มีประโยชน์ คุณสามารถใช้เครื่องจักรสถานะ จำกัด ได้เสมอโดยใช้ตารางการค้นหา (ไม่ใช่วิธี OO แต่ใช้งานได้ดี)
กลยุทธ์ใช้สำหรับ[GoF book p.ต่อไปนี้ 316] :
- คลาสที่เกี่ยวข้องจำนวนมากแตกต่างกันในพฤติกรรมของพวกเขาเท่านั้น กลยุทธ์มีวิธีการกำหนดค่าคลาสด้วยหนึ่งในพฤติกรรมหลายอย่าง
- คุณต้องการอัลกอริธึมที่แตกต่างกัน ตัวอย่างเช่นคุณอาจกำหนดอัลกอริทึมที่สะท้อนถึงการแลกเปลี่ยนพื้นที่ / เวลาที่แตกต่างกัน กลยุทธ์สามารถนำมาใช้ได้เมื่อมีการนำตัวแปรเหล่านี้มาใช้เป็นลำดับชั้นของอัลกอริทึม [HO87]
- อัลกอริทึมใช้ข้อมูลที่ลูกค้าไม่ควรรู้ ใช้รูปแบบกลยุทธ์เพื่อหลีกเลี่ยงการเปิดเผยโครงสร้างข้อมูลที่ซับซ้อนเฉพาะอัลกอริทึม
- ชั้นเรียนกำหนดพฤติกรรมหลายอย่างและสิ่งเหล่านี้จะปรากฏเป็นคำสั่งหลายเงื่อนไขในการดำเนินงานของมัน แทนที่จะย้ายเงื่อนไขจำนวนมากให้ย้ายสาขาตามเงื่อนไขที่เกี่ยวข้องไปยังคลาสกลยุทธ์ของตนเอง
กรณีล่าสุดของสถานที่ที่จะใช้กลยุทธ์ที่เกี่ยวข้องกับ refactoring ที่เรียกว่าเปลี่ยนเงื่อนไขที่มีความแตกต่าง
สรุป:รัฐและกลยุทธ์แก้ปัญหาที่แตกต่างกันมาก หากปัญหาของคุณไม่สามารถสร้างแบบจำลองด้วยเครื่องจักรสถานะ จำกัด ได้รูปแบบสถานะมีแนวโน้มไม่เหมาะสม หากปัญหาของคุณไม่เกี่ยวกับการห่อหุ้มตัวแปรของอัลกอริทึมที่ซับซ้อนดังนั้นกลยุทธ์จะไม่นำมาใช้
สถานะมีโครงสร้างคลาส UML ต่อไปนี้:
กลยุทธ์มีโครงสร้างคลาส UML ต่อไปนี้:
สรุป:ในแง่ของโครงสร้างแบบคงที่ทั้งสองรูปแบบส่วนใหญ่จะเหมือนกัน ในความเป็นจริงเครื่องมือตรวจจับรูปแบบเช่นนี้พิจารณาว่า " โครงสร้างของรูปแบบ [... ] เหมือนกันห้ามแยกแยะความแตกต่างด้วยกระบวนการอัตโนมัติ (เช่นโดยไม่อ้างอิงข้อมูลเชิงแนวคิด) "
อย่างไรก็ตามอาจมีความแตกต่างที่สำคัญได้หาก ConcreteStates ตัดสินใจว่าจะเปลี่ยนสถานะ (ดูที่ " อาจเป็นตัวกำหนด " ความสัมพันธ์ในแผนภาพด้านบน) สิ่งนี้ส่งผลให้เกิดการเชื่อมต่อระหว่างสถานะคอนกรีต ตัวอย่างเช่น (ดูหัวข้อถัดไป) สถานะ A เป็นตัวกำหนดการเปลี่ยนสถานะเป็น B หากคลาสบริบทตัดสินใจเปลี่ยนสถานะเป็นสถานะคอนกรีตถัดไปการอ้างอิงเหล่านี้จะหายไป
ดังที่กล่าวไว้ในส่วนของปัญหาข้างต้นรัฐบอกเป็นนัยถึงพฤติกรรมที่เปลี่ยนแปลงในเวลาทำงานขึ้นอยู่กับสถานะบางอย่างของวัตถุ ดังนั้นความคิดของรัฐเปลี่ยนนำไปใช้ตามที่กล่าวด้วยความสัมพันธ์ของเครื่องจักรสถานะ จำกัด [GoF] กล่าวถึงว่าช่วงการเปลี่ยนภาพสามารถกำหนดได้ในซับคลาส ConcreteState หรือในตำแหน่งส่วนกลาง (เช่นตำแหน่งตามตาราง)
สมมติว่าเป็นเครื่อง จำกัด อันเรียบง่าย:
สมมติว่าคลาสย่อยตัดสินใจเปลี่ยนสถานะ (โดยส่งคืนออบเจ็กต์สถานะถัดไป) ไดนามิกจะมีลักษณะดังนี้:
เพื่อแสดงให้เห็นการเปลี่ยนแปลงของกลยุทธ์มันมีประโยชน์ที่จะยืมตัวอย่างจริง
สรุป : แต่ละรูปแบบใช้การเรียก polymorphic เพื่อทำอะไรบางอย่างขึ้นอยู่กับบริบท ในรูปแบบรัฐสาย polymorphic (เปลี่ยนแปลง) มักจะทำให้เกิดการเปลี่ยนแปลงในครั้งต่อไปของรัฐ ในรูปแบบกลยุทธ์การโทรแบบ polymorphic จะไม่เปลี่ยนบริบท (เช่นการชำระด้วยบัตรเครดิตครั้งเดียวไม่ได้หมายความว่าคุณจะชำระเงินด้วย PayPal ในครั้งต่อไป) อีกครั้งพลวัตของรูปแบบของรัฐจะถูกกำหนดโดยกลไกสถานะของ fininte ที่สอดคล้องกันซึ่ง (สำหรับฉัน) เป็นสิ่งจำเป็นในการแก้ไขการใช้รูปแบบนี้
รูปแบบกลยุทธ์เกี่ยวข้องกับการย้ายการใช้งานของอัลกอริทึมจากคลาสการโฮสต์และวางในคลาสที่แยกต่างหาก ซึ่งหมายความว่าคลาสโฮสต์ไม่จำเป็นต้องจัดเตรียมการใช้งานของอัลกอริทึมแต่ละตัวซึ่งน่าจะนำไปสู่โค้ดที่ไม่สะอาด
อัลกอริทึมการเรียงลำดับมักใช้เป็นตัวอย่างเนื่องจากทุกอย่างทำสิ่งเดียวกัน (เรียงลำดับ) หากอัลกอริทึมการเรียงลำดับที่แตกต่างกันถูกใส่ลงในคลาสของตนเองลูกค้าสามารถเลือกอัลกอริทึมที่จะใช้และรูปแบบนั้นให้วิธีเข้าถึงที่ง่าย
รูปแบบสถานะเกี่ยวข้องกับการเปลี่ยนพฤติกรรมของวัตถุเมื่อสถานะของวัตถุเปลี่ยนแปลง ซึ่งหมายความว่าคลาสโฮสต์ไม่มีการใช้งานพฤติกรรมสำหรับสถานะที่แตกต่างกันทั้งหมดที่สามารถเป็นได้คลาสโฮสต์มักจะสรุปคลาสที่จัดเตรียมฟังก์ชันที่ต้องการในสถานะที่กำหนดและสลับไปใช้คลาสอื่น เมื่อรัฐเปลี่ยน
พิจารณาระบบ IVR (Interactive Voice Response) เพื่อจัดการการโทรของลูกค้า คุณอาจต้องการตั้งโปรแกรมเพื่อจัดการกับลูกค้าใน:
การจัดการกับสถานการณ์นี้คุณสามารถใช้รูปแบบรัฐ
กระบวนการเชื่อมต่อลูกค้ากับผู้บริหารสนับสนุนนี้สามารถนำไปใช้งานโดยใช้รูปแบบกลยุทธ์ซึ่งผู้บริหารจะถูกเลือกโดยพิจารณาจาก:
รูปแบบกลยุทธ์ตัดสินใจ ' วิธีการ ' เพื่อดำเนินการบางอย่างและรูปแบบของรัฐจะตัดสินใจเลือก ' เมื่อ ' เพื่อดำเนินการ
กลยุทธ์แสดงถึงวัตถุที่ "ทำ" บางสิ่งที่มีผลลัพธ์เริ่มต้นและสิ้นสุดเหมือนกัน ในแง่ที่ว่าพวกเขามีความคล้ายคลึงกับการเป็นตัวแทนของการใช้คำกริยา รูปแบบสถานะ OTOH ใช้วัตถุที่ "เป็น" บางสิ่ง - สถานะของการดำเนินการ ในขณะที่พวกเขาสามารถเป็นตัวแทนของการดำเนินการกับข้อมูลนั้นพวกเขาก็มีความคล้ายคลึงกับการเป็นตัวแทนของคำนามมากกว่ากริยาและปรับให้เหมาะกับเครื่องจักรของรัฐ
กลยุทธ์: กลยุทธ์ได้รับการแก้ไขและมักประกอบด้วยหลายขั้นตอน (การเรียงลำดับถือเป็นเพียงขั้นตอนเดียวเท่านั้นดังนั้นจึงเป็นตัวอย่างที่แย่มากเนื่องจากเป็นแบบดั้งเดิมเกินไปที่จะเข้าใจวัตถุประสงค์ของรูปแบบนี้) รูทีน "หลัก" ของคุณในกลยุทธ์กำลังเรียกวิธีนามธรรมสองสามข้อ เช่น "Enter Room Strategy", "main-method" คือ goThroughDoor () ซึ่งดูเหมือนว่า: approachDoor (), ถ้า (ล็อก ()) openLock (); เปิดประตู(); enterRoom (); กลับ(); ปิดประตู(); if (wasLocked ()) lockDoor ();
ตอนนี้คลาสย่อยของอัลกอริทึม "ทั่วไป" นี้สำหรับการย้ายจากห้องหนึ่งไปอีกห้องหนึ่งผ่านประตูล็อคที่เป็นไปได้สามารถใช้ขั้นตอนของอัลกอริทึมได้
กล่าวอีกอย่างหนึ่งว่าการจัดคลาสย่อยกลยุทธ์ไม่ได้เปลี่ยนอัลกอริธึมพื้นฐานเพียงขั้นตอนเดียว
ข้างต้นนั้นเป็นรูปแบบวิธีการของแม่แบบ ตอนนี้ใส่ขั้นตอนที่เป็นของกัน (ปลดล็อค / ล็อคและเปิด / ปิด) ในวัตถุที่ใช้งานของตนเองและมอบหมายให้พวกเขา เช่นการล็อคด้วยกุญแจและการล็อคด้วยรหัสการ์ดนั้นเป็นการล็อคสองชนิด มอบหมายจากกลยุทธ์ไปยังวัตถุ "ขั้นตอน" ตอนนี้คุณมีรูปแบบกลยุทธ์แล้ว
รูปแบบสถานะเป็นสิ่งที่แตกต่างอย่างสิ้นเชิง
คุณมีวัตถุห่อและวัตถุห่อหุ้ม สิ่งที่ห่อคือ "รัฐ" วัตถุสถานะสามารถเข้าถึงได้ผ่าน wrapper ของมัน ตอนนี้คุณสามารถเปลี่ยนวัตถุที่ถูกห่อได้ตลอดเวลาดังนั้น wrapper จึงดูเหมือนว่าจะเปลี่ยนสถานะของมันหรือแม้แต่ "class" หรือชนิดของมัน
เช่นคุณมีบริการเข้าสู่ระบบ ยอมรับชื่อผู้ใช้และรหัสผ่าน มีเพียงวิธีเดียวเท่านั้น: เข้าสู่ระบบ (ชื่อผู้ใช้ String, String passwdHash) แทนที่จะตัดสินใจเองว่าจะยอมรับการล็อกออนหรือไม่มันจะมอบหมายการตัดสินใจให้กับวัตถุสถานะ วัตถุสถานะนั้นมักจะตรวจสอบว่าชุดค่าผสมของผู้ใช้ / รหัสผ่านที่ถูกต้องและทำการเข้าสู่ระบบ แต่ตอนนี้คุณสามารถแลกเปลี่ยน "ตัวตรวจสอบ" โดยที่อนุญาตให้ผู้ใช้ที่มีสิทธิ์เข้าสู่ระบบเท่านั้น (ในช่วงเวลาการบำรุงรักษาเช่น) หรือโดยผู้ที่ไม่ให้ใครเข้าสู่ระบบ นั่นหมายถึง "ตัวตรวจสอบ" แสดง "สถานะการเข้าสู่ระบบ" ของระบบ
ความแตกต่างที่สำคัญที่สุดคือเมื่อคุณเลือกกลยุทธ์ที่คุณติดไว้จนกว่าคุณจะทำเสร็จ นั่นหมายความว่าคุณเรียกมันว่า "วิธีการหลัก" และตราบใดที่มันยังใช้อยู่คุณจะไม่เปลี่ยนกลยุทธ์ OTOH ในสถานการณ์รูปแบบสถานะระหว่างรันไทม์ของระบบของคุณคุณเปลี่ยนสถานะโดยพลการตามที่เห็นสมควร
รูปแบบกลยุทธ์ถูกใช้เมื่อคุณมีอัลกอริทึมหลายอย่างสำหรับงานเฉพาะและไคลเอนต์ตัดสินใจใช้งานจริงที่จะใช้ที่รันไทม์
แผนภาพ UML จากบทความลวดลายกลยุทธ์wiki :
คุณสมบัติหลัก:
อ้างถึงโพสต์นี้สำหรับข้อมูลเพิ่มเติมและตัวอย่างจริง:
ตัวอย่างโลกแห่งความจริงของรูปแบบกลยุทธ์
รูปแบบสถานะอนุญาตให้วัตถุเปลี่ยนพฤติกรรมเมื่อสถานะภายในเปลี่ยนแปลง
แผนภาพ UML จาก บทความรูปแบบwiki State:
หากเราต้องเปลี่ยนพฤติกรรมของวัตถุตามสถานะของมันเราสามารถมีตัวแปรสถานะในวัตถุและใช้บล็อกเงื่อนไข if-else เพื่อดำเนินการต่าง ๆ ตามสถานะ รูปแบบของรัฐถูกนำมาใช้เพื่อให้วิธีการที่เป็นระบบและสูญเสียควบคู่ไปกับการบรรลุเป้าหมายผ่านการดำเนินงานตามบริบทและรัฐ
อ้างถึงบทความjournaldevนี้สำหรับรายละเอียดเพิ่มเติม
ความแตกต่างที่สำคัญจากแหล่งที่มาและบทความjournaldev :
ในภาษาของคนธรรมดา
ในรูปแบบกลยุทธ์ไม่มีรัฐหรือทั้งหมดมีสถานะเหมือนกัน สิ่งที่ทุกคนมีคือวิธีการปฏิบัติงานที่แตกต่างกันเช่นแพทย์ที่แตกต่างกันรักษาโรคเดียวกันของผู้ป่วยรายเดียวกันที่มีสถานะเดียวกันในวิธีที่แตกต่างกัน
ในรูปแบบของรัฐผู้กระทำมีรัฐเช่นรัฐปัจจุบันของผู้ป่วย (พูดที่อุณหภูมิสูงหรืออุณหภูมิต่ำ) ขึ้นอยู่กับการดำเนินการต่อไป (ยาตามใบสั่งแพทย์) จะตัดสินใจและรัฐหนึ่งสามารถนำไปสู่รัฐอื่นดังนั้นจึงมีรัฐ เพื่อรัฐพึ่งพา (องค์ประกอบทางเทคนิค)
หากเราพยายามที่จะเข้าใจในทางเทคนิคโดยอาศัยการเปรียบเทียบโค้ดของทั้งคู่เราอาจสูญเสียความเป็นตัวตนของสถานการณ์เพราะทั้งคู่ดูคล้ายกันมาก
ทั้งสองรูปแบบมอบสิทธิ์ให้กับคลาสฐานที่มีอนุพันธ์หลายอย่าง แต่ในรูปแบบของรัฐเท่านั้นที่คลาสอนุพันธ์เหล่านี้จะเก็บการอ้างอิงกลับไปยังคลาสบริบท
อีกวิธีในการดูคือรูปแบบกลยุทธ์เป็นรูปแบบที่เรียบง่ายกว่าของรูปแบบรัฐ รูปแบบย่อยถ้าคุณชอบ มันขึ้นอยู่กับว่าคุณต้องการให้รัฐที่ได้รับเพื่อเก็บการอ้างอิงกลับไปที่บริบทหรือไม่ (เช่น: คุณต้องการให้พวกเขาเรียกวิธีการในบริบท)
สำหรับข้อมูลเพิ่มเติม: โรเบิร์ตซีมาร์ติน (& มิคาห์มาร์ติน) ตอบคำถามนี้ในหนังสือของพวกเขา "หลักการเปรียวรูปแบบและการปฏิบัติใน C #" ( http://www.amazon.com/Agile-Principles-Patterns-Practices-C/dp/0131857258 )
นี่เป็นคำถามที่ค่อนข้างเก่า แต่ถึงกระนั้นฉันก็ยังมองหาคำตอบเดียวกันและนี่คือสิ่งที่ฉันค้นพบ
สำหรับรูปแบบของรัฐให้พิจารณาตัวอย่างของปุ่มเล่นของผู้เล่น เมื่อเราเล่นมันจะเริ่มเล่นและทำให้บริบทรับรู้ว่ากำลังเล่นอยู่ ทุกครั้งที่ลูกค้าต้องการดำเนินการเล่นเขาจะตรวจสอบสถานะปัจจุบันของผู้เล่น ตอนนี้ไคลเอนต์ทราบสถานะของวัตถุที่กำลังเล่นผ่านวัตถุบริบทดังนั้นเขาจึงเรียกวิธีการกระทำการหยุดวัตถุสถานะชั่วคราว ส่วนของลูกค้าตระหนักถึงสถานะและสิ่งที่รัฐต้องดำเนินการสามารถเป็นไปโดยอัตโนมัติ
https://www.youtube.com/watch?v=e45RMc76884 https://www.tutorialspoint.com/design_pattern/state_pattern.htm
ในกรณีของรูปแบบกลยุทธ์การจัดเรียงแผนภาพคลาสเหมือนกับรูปแบบของรัฐ ลูกค้ามาถึงข้อตกลงนี้เพื่อดำเนินการบางอย่าง นั่นคือแทนที่จะเป็นรัฐที่แตกต่างกันมีอัลกอริทึมที่แตกต่างกันพูดเช่นการวิเคราะห์ที่แตกต่างที่จำเป็นต้องดำเนินการในรูปแบบ ที่นี่ลูกค้าบอกบริบทสิ่งที่มันต้องการที่จะทำสิ่งที่ขั้นตอนวิธี (อัลกอริทึมที่กำหนดเองที่กำหนดเองทางธุรกิจ) แล้วดำเนินการที่
https://www.tutorialspoint.com/design_pattern/strategy_pattern.htm
ทั้งสองใช้หลักการแบบเปิดเพื่อให้นักพัฒนามีความสามารถในการเพิ่มสถานะใหม่ให้กับรูปแบบสถานะและอัลกอริทึมใหม่
แต่ความแตกต่างคือสิ่งที่พวกเขาใช้นั่นคือรูปแบบของรัฐที่ใช้ในการดำเนินการตรรกะที่แตกต่างกันขึ้นอยู่กับสถานะของวัตถุ และในกรณีของกลยุทธ์ที่แตกต่างกันตรรกะ
รัฐมาพร้อมกับการพึ่งพาเพียงเล็กน้อยภายในคลาสที่ได้รับจากรัฐ: เช่นเดียวกับรัฐหนึ่งรู้เกี่ยวกับรัฐอื่น ๆ ที่ตามมา ตัวอย่างเช่นฤดูร้อนมาหลังฤดูหนาวสำหรับทุกฤดูหรือรัฐส่งหลังจากรัฐที่ฝากสำหรับการช็อปปิ้ง
ในทางกลับกันกลยุทธ์ไม่มีการพึ่งพาเช่นนี้ ที่นี่สถานะใด ๆ สามารถเริ่มต้นได้ขึ้นอยู่กับชนิดของโปรแกรม / ผลิตภัณฑ์
ความแตกต่างที่จะกล่าวถึงในhttp://c2.com/cgi/wiki?StrategyPattern ฉันใช้รูปแบบกลยุทธ์เพื่ออนุญาตให้อัลกอริทึมที่แตกต่างกันถูกเลือกภายในกรอบงานโดยรวมสำหรับการวิเคราะห์ข้อมูล โดยที่คุณสามารถเพิ่มอัลกอริทึมโดยไม่ต้องเปลี่ยนเฟรมเวิร์กโดยรวมและตรรกะของมัน
ตัวอย่างทั่วไปคือคุณมีกรอบสำหรับการปรับฟังก์ชั่นให้เหมาะสม เฟรมเวิร์กตั้งค่าข้อมูลและพารามิเตอร์ รูปแบบกลยุทธ์ช่วยให้คุณสามารถเลือกอัลกอริธึมเช่น sttepest descents, gradients conjugate, BFGS, ฯลฯ โดยไม่ต้องเปลี่ยนเฟรมเวิร์ก
ทั้งรูปแบบกลยุทธ์และรัฐมีโครงสร้างเดียวกัน ถ้าคุณดูไดอะแกรมคลาส UML สำหรับทั้งสองรูปแบบพวกเขาดูเหมือนกันหมด แต่เจตนาของพวกเขานั้นแตกต่างกันโดยสิ้นเชิง รูปแบบการออกแบบของรัฐใช้เพื่อกำหนดและจัดการสถานะของวัตถุในขณะที่รูปแบบกลยุทธ์ใช้เพื่อกำหนดชุดของอัลกอริทึมแบบถอดเปลี่ยนได้และให้ลูกค้าเลือกหนึ่งในนั้น ดังนั้นรูปแบบกลยุทธ์จึงเป็นรูปแบบการขับเคลื่อนของลูกค้าในขณะที่ Object สามารถจัดการสถานะดังกล่าวได้
ในระยะสั้นด้วยรูปแบบกลยุทธ์ที่เราสามารถกำหนดพฤติกรรมบางอย่างได้ทันทีด้วยรูปแบบของรัฐเรามั่นใจได้ว่าวัตถุจะเปลี่ยนพฤติกรรมภายในด้วยการเปลี่ยนแปลงของรัฐ
เมื่อคุณมีโครงการซึ่งสามารถแบ่งออกเป็น 2 งาน:
ภารกิจที่ 1: คุณสามารถใช้หนึ่งในสองอัลกอริทึมที่แตกต่างกันเพื่อให้บรรลุ: alg1, alg2
ภารกิจที่ 2: คุณสามารถใช้หนึ่งในสามอัลกอริทึมที่แตกต่างกันเพื่อให้บรรลุ: alg3, alg4, alg5
alg1 และ alg2 สามารถใช้แทนกันได้ alg3, alg4 และ alg5 สามารถใช้แทนกันได้
การเลือกอัลกอริทึมที่จะดำเนินการในงาน 1 และภารกิจ 2 ขึ้นอยู่กับสถานะ:
สถานะ 1: คุณต้องใช้ alg1 ในงาน 1 และ alg3 ในงาน 2
สถานะ 2: คุณต้องใช้ alg2 ในภารกิจ 1 และ alg5 ในภารกิจ 2
บริบทคุณสามารถเปลี่ยนสถานะวัตถุจากสถานะ 1 เป็นสถานะ 2 จากนั้นงานของคุณจะสำเร็จโดย alg2 และ alg5 แทน alg1 และ alg3
คุณสามารถเพิ่มอัลกอริทึมแบบถอดเปลี่ยนได้เพิ่มเติมสำหรับภารกิจ 1 หรือภารกิจ 2 นี่คือรูปแบบกลยุทธ์
คุณสามารถมีสถานะมากขึ้นด้วยการรวมอัลกอริทึมที่แตกต่างกันในงาน 1 และภารกิจที่ 2 รูปแบบสถานะอนุญาตให้คุณสลับจากสถานะหนึ่งไปอีกรัฐหนึ่ง
'กลยุทธ์' เป็นเพียงอัลกอริทึมที่คุณสามารถเปลี่ยนได้ในสถานการณ์ที่แตกต่างกันตามความต้องการของคุณและจะประมวลผลบางอย่างสำหรับคุณ อดีต คุณสามารถเลือกวิธีบีบอัดไฟล์ zip หรือ rar ... ในเมธอด
แต่ 'สถานะ' สามารถเปลี่ยนพฤติกรรมวัตถุทั้งหมดของคุณเมื่อมีการเปลี่ยนแปลงแม้ว่ามันจะสามารถเปลี่ยนฟิลด์อื่น ๆ ... นั่นคือเหตุผลที่มันมีการอ้างอิงถึงเจ้าของ คุณควรสังเกตว่าการเปลี่ยนฟิลด์วัตถุสามารถเปลี่ยนพฤติกรรมของวัตถุได้เลย อดีต เมื่อคุณเปลี่ยน State0 เป็น State1 ใน obj คุณเปลี่ยนจำนวนเต็มเป็น 10 .. ดังนั้นเมื่อเราเรียก obj.f0 () ที่ทำการคำนวณและใช้จำนวนเต็มนั้นมันจะส่งผลต่อผลลัพธ์