รูปแบบการออกแบบกลยุทธ์และรูปแบบการออกแบบของรัฐแตกต่างกันอย่างไร


219

อะไรคือความแตกต่างระหว่างรูปแบบการออกแบบกลยุทธ์และรูปแบบการออกแบบของรัฐ? ฉันกำลังอ่านบทความไม่กี่เรื่องบนเว็บ แต่ไม่สามารถบอกความแตกต่างได้อย่างชัดเจน

ใครช่วยอธิบายความแตกต่างในเงื่อนไขของคนธรรมดาได้มั้ย


จากคำตอบที่นี่และการสังเกตของฉันเองดูเหมือนว่าการใช้งานส่วนใหญ่ (แม้ว่าจะไม่ใช่ทั้งหมด) เหมือนกัน แต่ความแตกต่างส่วนใหญ่เป็นหนึ่งในเจตนา: เรากำลังพยายามปรับพฤติกรรมโดยยึดตามสถานะของเรา (รูปแบบของรัฐ) หรือตามอย่างอื่น (รูปแบบกลยุทธ์) บ่อยครั้งที่สิ่งอื่นคือ "สิ่งที่ลูกค้าเลือก" ผ่านการฉีด
Timo

คำตอบ:


139

จริง ๆ แล้วทั้งสองรูปแบบมีความคล้ายคลึงกันในทางปฏิบัติและความแตกต่างระหว่างทั้งสองมีแนวโน้มที่จะแตกต่างกันไปตามที่คุณถาม ตัวเลือกยอดนิยมบางประการ ได้แก่ :

  • รัฐเก็บการอ้างอิงไปยังวัตถุบริบทที่มีพวกเขา กลยุทธ์ไม่ได้
  • รัฐได้รับอนุญาตให้แทนที่ตัวเอง (IE: เพื่อเปลี่ยนสถานะของวัตถุบริบทเป็นอย่างอื่น) ในขณะที่กลยุทธ์ไม่ได้
  • กลยุทธ์ถูกส่งผ่านไปยังวัตถุบริบทเป็นพารามิเตอร์ในขณะที่รัฐถูกสร้างขึ้นโดยวัตถุบริบทเอง
  • กลยุทธ์จัดการเฉพาะงานที่เฉพาะเจาะจงเท่านั้นในขณะที่รัฐจัดเตรียมการดำเนินการพื้นฐานสำหรับทุกสิ่ง (หรือทุกอย่างส่วนใหญ่) วัตถุบริบททำ

การใช้งาน "แบบคลาสสิก" จะจับคู่ทั้งรัฐหรือกลยุทธ์สำหรับทุกรายการในรายการ แต่คุณจะวิ่งข้ามลูกผสมที่มีทั้งสองอย่างผสมกัน ไม่ว่าคนใดคนหนึ่งจะเป็นรัฐ -Y หรือ Strategy-y มากกว่านี้เป็นคำถามเชิงอัตวิสัย


6
หากคุณนับ GoF เป็นหนึ่งในตัวเลือกที่ได้รับความนิยมพวกเขาจะไม่เห็นด้วยที่รัฐจะต้องสร้างโดยบริบท (ลูกค้าสามารถสร้างขึ้นและส่งผ่านเข้าไปในบริบทเช่นเดียวกับกลยุทธ์)
Will Hardwick-Smith

109
  • กลยุทธ์รูปแบบที่เป็นจริงเกี่ยวกับการมีการดำเนินงานที่แตกต่างกันที่สำเร็จ (พื้น) สิ่งเดียวกันเพื่อให้การดำเนินการอย่างใดอย่างหนึ่งสามารถแทนที่อื่น ๆ ที่เป็นกลยุทธ์ที่ต้องใช้ ตัวอย่างเช่นคุณอาจมีอัลกอริทึมการเรียงลำดับที่แตกต่างกันในรูปแบบกลยุทธ์ ผู้เรียกไปยังออบเจ็กต์จะไม่เปลี่ยนแปลงตามกลยุทธ์ที่ใช้ แต่ไม่ว่ากลยุทธ์จะเป็นเป้าหมายเดียวกันก็ตาม (เรียงลำดับการรวบรวม)
  • รัฐรูปแบบเป็นเรื่องเกี่ยวกับการทำสิ่งที่แตกต่างกันขึ้นอยู่กับรัฐในขณะที่ออกโทรโล่งใจจากภาระในการรองรับทุกรัฐที่เป็นไปได้ ตัวอย่างเช่นคุณอาจมี getStatus()วิธีการที่จะคืนสถานะที่แตกต่างกันตามสถานะของวัตถุ แต่ผู้เรียกใช้ของวิธีนั้นไม่จำเป็นต้องถูกเข้ารหัสแตกต่างกันไปยังบัญชีสำหรับแต่ละรัฐที่มีศักยภาพ

1
แต่ใครจะเปลี่ยนกลยุทธ์ในรูปแบบกลยุทธ์?
นู

1
@ เหนือมักจะเป็นพารามิเตอร์หรือฟิลด์บางชนิด รหัสของผู้โทรจริงจะไม่เปลี่ยนแปลงตามการเปลี่ยนแปลงในกลยุทธ์
Yishai

4
@ ไม่มีใช่ แต่ในรูปแบบกลยุทธ์ใด ๆ ที่ฉันสามารถนึกได้ตอนนี้มันเป็นการตัดสินใจล่วงหน้าที่จะไม่เปลี่ยนแปลงตรงกลาง
Yishai

2
ฉันมีปัญหาเดียวกันรัฐหรือกลยุทธ์ฉันคิดว่าความแตกต่างในคำไม่กี่คำคือรัฐพฤติกรรมเป็นแบบอัตโนมัติการกำหนดกลยุทธ์พฤติกรรมถูกกำหนดโดยผู้โทร
Rene MF

1
ในแอปพลิเคชันอีคอมเมิร์ซหากต้องการส่วนลดพิเศษในช่วงเทศกาลก็เป็นรูปแบบการออกแบบของรัฐ ตรรกะอัตราคิดลดที่แท้จริงสามารถใช้กับรูปแบบการออกแบบกลยุทธ์ได้หากมีมากกว่าหนึ่งวิธีที่จะไปถึงหมายเลขนั้น
Bharathkumar V

85

ความแตกต่างอยู่ที่พวกเขาแก้ปัญหาต่าง ๆ :

  • รัฐข้อเสนอรูปแบบกับสิ่งที่ (รัฐหรือพิมพ์) วัตถุ (ใน) - มันห่อหุ้มพฤติกรรมรัฐขึ้นในขณะที่
  • กลยุทธ์ข้อเสนอรูปแบบด้วยวิธีการที่วัตถุดำเนินงานบางอย่าง - มันสุนทรีย์อัลกอริทึม

โครงสร้างสำหรับการบรรลุเป้าหมายที่แตกต่างกันเหล่านี้มีความคล้ายคลึงกันมาก ทั้งสองรูปแบบเป็นตัวอย่างของการแต่งเพลงพร้อมการมอบสิทธิ์


ข้อสังเกตบางประการเกี่ยวกับข้อดี:

โดยใช้รัฐรูปแบบของรัฐที่ถือครอง (บริบท) ชั้นก็โล่งใจจากความรู้ของสิ่งที่รัฐหรือพิมพ์เป็นและสิ่งที่รัฐหรือชนิดที่มีอยู่ ซึ่งหมายความว่าคลาสปฏิบัติตามหลักการออกแบบแบบเปิด (OCP): คลาสถูกปิดสำหรับการเปลี่ยนแปลงในสถานะ / ประเภทที่มี แต่รัฐ / ประเภทนั้นเปิดให้ส่วนขยาย

ด้วยการใช้รูปแบบกลยุทธ์ชั้นเรียนที่ใช้อัลกอริทึม (บริบท) จะถูกปลดออกจากความรู้เกี่ยวกับวิธีการปฏิบัติงานบางอย่าง (- "อัลกอริทึม") กรณีนี้สร้างการยึดมั่นกับ OCP ชั้นถูกปิดสำหรับการเปลี่ยนแปลงเกี่ยวกับวิธีการปฏิบัติงานนี้ แต่การออกแบบเปิดมากเพื่อเพิ่มขั้นตอนวิธีอื่น ๆ สำหรับการแก้งานนี้
สิ่งนี้มีแนวโน้มที่จะปรับปรุงการยึดมั่นในบริบทของคลาสตามหลักการความรับผิดชอบเดี่ยว (SRP) นอกจากนี้อัลกอริทึมจะสามารถใช้งานได้อย่างง่ายดายเพื่อนำมาใช้ใหม่โดยคลาสอื่น ๆ


42

ใครช่วยอธิบายในแง่ของคนธรรมดาได้มั้ย

รูปแบบการออกแบบไม่ใช่แนวคิด "คนธรรมดา" จริงๆ แต่ฉันจะพยายามทำให้ชัดเจนที่สุด รูปแบบการออกแบบใด ๆ สามารถพิจารณาในสามมิติ:

  1. ปัญหารูปแบบการแก้ปัญหา;
  2. โครงสร้างคงที่ของรูปแบบ (แผนภาพคลาส);
  3. พลวัตของรูปแบบ (แผนภาพลำดับ)

ลองเปรียบเทียบสถานะและกลยุทธ์

ปัญหาการแก้ไขลวดลาย

สถานะถูกใช้ในหนึ่งในสองกรณี[GoF book p. 306] :

  • พฤติกรรมของวัตถุขึ้นอยู่กับสถานะของมันและมันจะต้องเปลี่ยนพฤติกรรมของมันในเวลาทำงานขึ้นอยู่กับสถานะนั้น
  • การดำเนินการมีคำสั่งแบบมีเงื่อนไขจำนวนมากที่ขึ้นอยู่กับสถานะของวัตถุ สถานะนี้มักจะแสดงโดยหนึ่งหรือมากกว่าค่าคงที่ระบุ บ่อยครั้งการดำเนินการหลายอย่างจะมีโครงสร้างที่มีเงื่อนไขเดียวกันนี้ รูปแบบสถานะทำให้แต่ละสาขาของเงื่อนไขเป็นคลาสแยกต่างหาก สิ่งนี้ช่วยให้คุณปฏิบัติต่อสถานะของวัตถุเป็นวัตถุในสิทธิ์ของตนเองซึ่งสามารถแตกต่างจากวัตถุอื่น

หากคุณต้องการให้แน่ใจว่าคุณมีปัญหาแน่นอนรูปแบบรัฐแก้คุณควรจะสามารถในการจำลองรัฐของวัตถุที่ใช้เครื่องจักรสถานะ จำกัด คุณสามารถค้นหาตัวอย่างที่นำมาใช้ที่นี่

การเปลี่ยนสถานะแต่ละครั้งเป็นวิธีการในส่วนต่อประสานสถานะ นี่ก็หมายความว่าสำหรับการออกแบบคุณจะต้องแน่ใจเกี่ยวกับการเปลี่ยนสถานะก่อนที่คุณจะใช้รูปแบบนี้ มิฉะนั้นถ้าคุณเพิ่มหรือลบการเปลี่ยนมันจะต้องเปลี่ยนอินเตอร์เฟซและชั้นเรียนทั้งหมดที่ใช้มัน

ฉันเองไม่พบรูปแบบนี้ที่มีประโยชน์ คุณสามารถใช้เครื่องจักรสถานะ จำกัด ได้เสมอโดยใช้ตารางการค้นหา (ไม่ใช่วิธี OO แต่ใช้งานได้ดี)

กลยุทธ์ใช้สำหรับ[GoF book p.ต่อไปนี้ 316] :

  • คลาสที่เกี่ยวข้องจำนวนมากแตกต่างกันในพฤติกรรมของพวกเขาเท่านั้น กลยุทธ์มีวิธีการกำหนดค่าคลาสด้วยหนึ่งในพฤติกรรมหลายอย่าง
  • คุณต้องการอัลกอริธึมที่แตกต่างกัน ตัวอย่างเช่นคุณอาจกำหนดอัลกอริทึมที่สะท้อนถึงการแลกเปลี่ยนพื้นที่ / เวลาที่แตกต่างกัน กลยุทธ์สามารถนำมาใช้ได้เมื่อมีการนำตัวแปรเหล่านี้มาใช้เป็นลำดับชั้นของอัลกอริทึม [HO87]
  • อัลกอริทึมใช้ข้อมูลที่ลูกค้าไม่ควรรู้ ใช้รูปแบบกลยุทธ์เพื่อหลีกเลี่ยงการเปิดเผยโครงสร้างข้อมูลที่ซับซ้อนเฉพาะอัลกอริทึม
  • ชั้นเรียนกำหนดพฤติกรรมหลายอย่างและสิ่งเหล่านี้จะปรากฏเป็นคำสั่งหลายเงื่อนไขในการดำเนินงานของมัน แทนที่จะย้ายเงื่อนไขจำนวนมากให้ย้ายสาขาตามเงื่อนไขที่เกี่ยวข้องไปยังคลาสกลยุทธ์ของตนเอง

กรณีล่าสุดของสถานที่ที่จะใช้กลยุทธ์ที่เกี่ยวข้องกับ refactoring ที่เรียกว่าเปลี่ยนเงื่อนไขที่มีความแตกต่าง

สรุป:รัฐและกลยุทธ์แก้ปัญหาที่แตกต่างกันมาก หากปัญหาของคุณไม่สามารถสร้างแบบจำลองด้วยเครื่องจักรสถานะ จำกัด ได้รูปแบบสถานะมีแนวโน้มไม่เหมาะสม หากปัญหาของคุณไม่เกี่ยวกับการห่อหุ้มตัวแปรของอัลกอริทึมที่ซับซ้อนดังนั้นกลยุทธ์จะไม่นำมาใช้

โครงสร้างแบบคงที่ของรูปแบบ

สถานะมีโครงสร้างคลาส UML ต่อไปนี้:

แผนภาพคลาส PlantUML ของรูปแบบสถานะ

กลยุทธ์มีโครงสร้างคลาส UML ต่อไปนี้:

แผนภาพคลาส PlantUML ของรูปแบบกลยุทธ์

สรุป:ในแง่ของโครงสร้างแบบคงที่ทั้งสองรูปแบบส่วนใหญ่จะเหมือนกัน ในความเป็นจริงเครื่องมือตรวจจับรูปแบบเช่นนี้พิจารณาว่า " โครงสร้างของรูปแบบ [... ] เหมือนกันห้ามแยกแยะความแตกต่างด้วยกระบวนการอัตโนมัติ (เช่นโดยไม่อ้างอิงข้อมูลเชิงแนวคิด) "

อย่างไรก็ตามอาจมีความแตกต่างที่สำคัญได้หาก ConcreteStates ตัดสินใจว่าจะเปลี่ยนสถานะ (ดูที่ " อาจเป็นตัวกำหนด " ความสัมพันธ์ในแผนภาพด้านบน) สิ่งนี้ส่งผลให้เกิดการเชื่อมต่อระหว่างสถานะคอนกรีต ตัวอย่างเช่น (ดูหัวข้อถัดไป) สถานะ A เป็นตัวกำหนดการเปลี่ยนสถานะเป็น B หากคลาสบริบทตัดสินใจเปลี่ยนสถานะเป็นสถานะคอนกรีตถัดไปการอ้างอิงเหล่านี้จะหายไป

พลวัตของรูปแบบ

ดังที่กล่าวไว้ในส่วนของปัญหาข้างต้นรัฐบอกเป็นนัยถึงพฤติกรรมที่เปลี่ยนแปลงในเวลาทำงานขึ้นอยู่กับสถานะบางอย่างของวัตถุ ดังนั้นความคิดของรัฐเปลี่ยนนำไปใช้ตามที่กล่าวด้วยความสัมพันธ์ของเครื่องจักรสถานะ จำกัด [GoF] กล่าวถึงว่าช่วงการเปลี่ยนภาพสามารถกำหนดได้ในซับคลาส ConcreteState หรือในตำแหน่งส่วนกลาง (เช่นตำแหน่งตามตาราง)

สมมติว่าเป็นเครื่อง จำกัด อันเรียบง่าย:

แผนภาพการเปลี่ยนสถานะ PlantUML ที่มีสองสถานะและหนึ่งการเปลี่ยนแปลง

สมมติว่าคลาสย่อยตัดสินใจเปลี่ยนสถานะ (โดยส่งคืนออบเจ็กต์สถานะถัดไป) ไดนามิกจะมีลักษณะดังนี้:

แผนภาพลำดับ PlantUML สำหรับการเปลี่ยนสถานะ

เพื่อแสดงให้เห็นการเปลี่ยนแปลงของกลยุทธ์มันมีประโยชน์ที่จะยืมตัวอย่างจริง

แผนภาพลำดับ PlantUML สำหรับการเปลี่ยนกลยุทธ์

สรุป : แต่ละรูปแบบใช้การเรียก polymorphic เพื่อทำอะไรบางอย่างขึ้นอยู่กับบริบท ในรูปแบบรัฐสาย polymorphic (เปลี่ยนแปลง) มักจะทำให้เกิดการเปลี่ยนแปลงในครั้งต่อไปของรัฐ ในรูปแบบกลยุทธ์การโทรแบบ polymorphic จะไม่เปลี่ยนบริบท (เช่นการชำระด้วยบัตรเครดิตครั้งเดียวไม่ได้หมายความว่าคุณจะชำระเงินด้วย PayPal ในครั้งต่อไป) อีกครั้งพลวัตของรูปแบบของรัฐจะถูกกำหนดโดยกลไกสถานะของ fininte ที่สอดคล้องกันซึ่ง (สำหรับฉัน) เป็นสิ่งจำเป็นในการแก้ไขการใช้รูปแบบนี้


คำตอบนี้มีประโยชน์มากสำหรับฉันที่จะทำให้ฉันเห็นความแตกต่าง อาร์กิวเมนต์สถานะของเครื่องจักรดูเหมือนจะเป็น IMHO ที่เกี่ยวข้อง นี่เป็นการสรุปคำตอบข้างต้นด้วยวิธีวิทยาการคอมพิวเตอร์เชิงทฤษฎี
medunes

คำตอบนี้มีประโยชน์มากสำหรับฉันนี่คือสิ่งที่ดีที่สุด
Chofoteddy

25

รูปแบบกลยุทธ์เกี่ยวข้องกับการย้ายการใช้งานของอัลกอริทึมจากคลาสการโฮสต์และวางในคลาสที่แยกต่างหาก ซึ่งหมายความว่าคลาสโฮสต์ไม่จำเป็นต้องจัดเตรียมการใช้งานของอัลกอริทึมแต่ละตัวซึ่งน่าจะนำไปสู่โค้ดที่ไม่สะอาด

อัลกอริทึมการเรียงลำดับมักใช้เป็นตัวอย่างเนื่องจากทุกอย่างทำสิ่งเดียวกัน (เรียงลำดับ) หากอัลกอริทึมการเรียงลำดับที่แตกต่างกันถูกใส่ลงในคลาสของตนเองลูกค้าสามารถเลือกอัลกอริทึมที่จะใช้และรูปแบบนั้นให้วิธีเข้าถึงที่ง่าย

รูปแบบสถานะเกี่ยวข้องกับการเปลี่ยนพฤติกรรมของวัตถุเมื่อสถานะของวัตถุเปลี่ยนแปลง ซึ่งหมายความว่าคลาสโฮสต์ไม่มีการใช้งานพฤติกรรมสำหรับสถานะที่แตกต่างกันทั้งหมดที่สามารถเป็นได้คลาสโฮสต์มักจะสรุปคลาสที่จัดเตรียมฟังก์ชันที่ต้องการในสถานะที่กำหนดและสลับไปใช้คลาสอื่น เมื่อรัฐเปลี่ยน


16

พิจารณาระบบ IVR (Interactive Voice Response) เพื่อจัดการการโทรของลูกค้า คุณอาจต้องการตั้งโปรแกรมเพื่อจัดการกับลูกค้าใน:

  • วันทำงาน
  • วันหยุด

การจัดการกับสถานการณ์นี้คุณสามารถใช้รูปแบบรัฐ

  • วันหยุด : IVR ตอบกลับโดยบอกว่า ' สามารถโทรได้เฉพาะวันทำงานระหว่าง 9.00 น. ถึง 17.00 น. '
  • วันทำงาน : ตอบสนองโดยเชื่อมต่อลูกค้ากับผู้บริหารดูแลลูกค้า

กระบวนการเชื่อมต่อลูกค้ากับผู้บริหารสนับสนุนนี้สามารถนำไปใช้งานโดยใช้รูปแบบกลยุทธ์ซึ่งผู้บริหารจะถูกเลือกโดยพิจารณาจาก:

  • Round Robin
  • ใช้น้อยที่สุด
  • อัลกอริทึมตามลำดับความสำคัญอื่น ๆ

รูปแบบกลยุทธ์ตัดสินใจ ' วิธีการ ' เพื่อดำเนินการบางอย่างและรูปแบบของรัฐจะตัดสินใจเลือก ' เมื่อ ' เพื่อดำเนินการ


นี่คือคำตอบที่ยอดเยี่ยมและ underrated แต่มันจะมีประโยชน์ที่จะพูดถึงว่าทำไมจึงมีความต้องการอัลกอริทึมมากมายในตัวอย่างของคุณ ตัวอย่างเช่นอัลกอริทึมจะถูกเลือกตามความต้องการของ บริษัท คอลเซ็นเตอร์ นอกจากนี้ยังจะช่วยหากมีอัลกอริทึมที่ง่ายหรือไม่สำคัญในรายการของคุณสำหรับผู้ที่ไม่รู้จัก RR หรือ LRU ตัวอย่างเช่น - ลูกค้าที่ใช้เวลานานจะได้รับความสำคัญสูงกว่าลูกค้าที่รอคอยส่วนใหญ่จะได้รับความสำคัญสูง ขอบคุณมาก!
MasterJoe2

14

กลยุทธ์แสดงถึงวัตถุที่ "ทำ" บางสิ่งที่มีผลลัพธ์เริ่มต้นและสิ้นสุดเหมือนกัน ในแง่ที่ว่าพวกเขามีความคล้ายคลึงกับการเป็นตัวแทนของการใช้คำกริยา รูปแบบสถานะ OTOH ใช้วัตถุที่ "เป็น" บางสิ่ง - สถานะของการดำเนินการ ในขณะที่พวกเขาสามารถเป็นตัวแทนของการดำเนินการกับข้อมูลนั้นพวกเขาก็มีความคล้ายคลึงกับการเป็นตัวแทนของคำนามมากกว่ากริยาและปรับให้เหมาะกับเครื่องจักรของรัฐ


11

กลยุทธ์: กลยุทธ์ได้รับการแก้ไขและมักประกอบด้วยหลายขั้นตอน (การเรียงลำดับถือเป็นเพียงขั้นตอนเดียวเท่านั้นดังนั้นจึงเป็นตัวอย่างที่แย่มากเนื่องจากเป็นแบบดั้งเดิมเกินไปที่จะเข้าใจวัตถุประสงค์ของรูปแบบนี้) รูทีน "หลัก" ของคุณในกลยุทธ์กำลังเรียกวิธีนามธรรมสองสามข้อ เช่น "Enter Room Strategy", "main-method" คือ goThroughDoor () ซึ่งดูเหมือนว่า: approachDoor (), ถ้า (ล็อก ()) openLock (); เปิดประตู(); enterRoom (); กลับ(); ปิดประตู(); if (wasLocked ()) lockDoor ();

ตอนนี้คลาสย่อยของอัลกอริทึม "ทั่วไป" นี้สำหรับการย้ายจากห้องหนึ่งไปอีกห้องหนึ่งผ่านประตูล็อคที่เป็นไปได้สามารถใช้ขั้นตอนของอัลกอริทึมได้

กล่าวอีกอย่างหนึ่งว่าการจัดคลาสย่อยกลยุทธ์ไม่ได้เปลี่ยนอัลกอริธึมพื้นฐานเพียงขั้นตอนเดียว

ข้างต้นนั้นเป็นรูปแบบวิธีการของแม่แบบ ตอนนี้ใส่ขั้นตอนที่เป็นของกัน (ปลดล็อค / ล็อคและเปิด / ปิด) ในวัตถุที่ใช้งานของตนเองและมอบหมายให้พวกเขา เช่นการล็อคด้วยกุญแจและการล็อคด้วยรหัสการ์ดนั้นเป็นการล็อคสองชนิด มอบหมายจากกลยุทธ์ไปยังวัตถุ "ขั้นตอน" ตอนนี้คุณมีรูปแบบกลยุทธ์แล้ว

รูปแบบสถานะเป็นสิ่งที่แตกต่างอย่างสิ้นเชิง

คุณมีวัตถุห่อและวัตถุห่อหุ้ม สิ่งที่ห่อคือ "รัฐ" วัตถุสถานะสามารถเข้าถึงได้ผ่าน wrapper ของมัน ตอนนี้คุณสามารถเปลี่ยนวัตถุที่ถูกห่อได้ตลอดเวลาดังนั้น wrapper จึงดูเหมือนว่าจะเปลี่ยนสถานะของมันหรือแม้แต่ "class" หรือชนิดของมัน

เช่นคุณมีบริการเข้าสู่ระบบ ยอมรับชื่อผู้ใช้และรหัสผ่าน มีเพียงวิธีเดียวเท่านั้น: เข้าสู่ระบบ (ชื่อผู้ใช้ String, String passwdHash) แทนที่จะตัดสินใจเองว่าจะยอมรับการล็อกออนหรือไม่มันจะมอบหมายการตัดสินใจให้กับวัตถุสถานะ วัตถุสถานะนั้นมักจะตรวจสอบว่าชุดค่าผสมของผู้ใช้ / รหัสผ่านที่ถูกต้องและทำการเข้าสู่ระบบ แต่ตอนนี้คุณสามารถแลกเปลี่ยน "ตัวตรวจสอบ" โดยที่อนุญาตให้ผู้ใช้ที่มีสิทธิ์เข้าสู่ระบบเท่านั้น (ในช่วงเวลาการบำรุงรักษาเช่น) หรือโดยผู้ที่ไม่ให้ใครเข้าสู่ระบบ นั่นหมายถึง "ตัวตรวจสอบ" แสดง "สถานะการเข้าสู่ระบบ" ของระบบ

ความแตกต่างที่สำคัญที่สุดคือเมื่อคุณเลือกกลยุทธ์ที่คุณติดไว้จนกว่าคุณจะทำเสร็จ นั่นหมายความว่าคุณเรียกมันว่า "วิธีการหลัก" และตราบใดที่มันยังใช้อยู่คุณจะไม่เปลี่ยนกลยุทธ์ OTOH ในสถานการณ์รูปแบบสถานะระหว่างรันไทม์ของระบบของคุณคุณเปลี่ยนสถานะโดยพลการตามที่เห็นสมควร


9

รูปแบบกลยุทธ์ถูกใช้เมื่อคุณมีอัลกอริทึมหลายอย่างสำหรับงานเฉพาะและไคลเอนต์ตัดสินใจใช้งานจริงที่จะใช้ที่รันไทม์

แผนภาพ UML จากบทความลวดลายกลยุทธ์wiki :

ป้อนคำอธิบายรูปภาพที่นี่

คุณสมบัติหลัก:

  1. มันเป็นรูปแบบพฤติกรรม
  2. มันขึ้นอยู่กับการมอบหมาย
  3. มันเปลี่ยนความกล้าของวัตถุโดยการปรับเปลี่ยนพฤติกรรมวิธีการ
  4. มันใช้เพื่อสลับระหว่างตระกูลของอัลกอริทึม
  5. มันเปลี่ยนพฤติกรรมของวัตถุในเวลาทำงาน

อ้างถึงโพสต์นี้สำหรับข้อมูลเพิ่มเติมและตัวอย่างจริง:

ตัวอย่างโลกแห่งความจริงของรูปแบบกลยุทธ์

รูปแบบสถานะอนุญาตให้วัตถุเปลี่ยนพฤติกรรมเมื่อสถานะภายในเปลี่ยนแปลง

แผนภาพ UML จาก บทความรูปแบบwiki State:

ป้อนคำอธิบายรูปภาพที่นี่

หากเราต้องเปลี่ยนพฤติกรรมของวัตถุตามสถานะของมันเราสามารถมีตัวแปรสถานะในวัตถุและใช้บล็อกเงื่อนไข if-else เพื่อดำเนินการต่าง ๆ ตามสถานะ รูปแบบของรัฐถูกนำมาใช้เพื่อให้วิธีการที่เป็นระบบและสูญเสียควบคู่ไปกับการบรรลุเป้าหมายผ่านการดำเนินงานตามบริบทและรัฐ

อ้างถึงบทความjournaldevนี้สำหรับรายละเอียดเพิ่มเติม

ความแตกต่างที่สำคัญจากแหล่งที่มาและบทความjournaldev :

  1. ความแตกต่างระหว่างรัฐกับยุทธศาสตร์อยู่ที่เวลาผูกพัน กลยุทธ์การเป็นรูปแบบการผูกครั้งเดียวในขณะที่รัฐเป็นแบบไดนามิกมากขึ้น
  2. ความแตกต่างระหว่างรัฐกับยุทธศาสตร์นั้นอยู่ในเจตนา ด้วยกลยุทธ์ทางเลือกของอัลกอริทึมที่มีเสถียรภาพพอสมควร กับรัฐมีการเปลี่ยนแปลงในสถานะของ "บริบท" วัตถุที่ทำให้เกิดการเลือกจาก "จาน" ของวัตถุกลยุทธ์
  3. บริบทมีสถานะเป็นตัวแปรอินสแตนซ์และสามารถมีได้หลายงานซึ่งการใช้งานขึ้นอยู่กับสถานะในขณะที่กลยุทธ์รูปแบบกลยุทธ์ถูกส่งผ่านเป็นอาร์กิวเมนต์ไปยังวิธีการและวัตถุบริบทไม่มีตัวแปรใด ๆ ที่จะเก็บไว้

5

ในภาษาของคนธรรมดา

ในรูปแบบกลยุทธ์ไม่มีรัฐหรือทั้งหมดมีสถานะเหมือนกัน สิ่งที่ทุกคนมีคือวิธีการปฏิบัติงานที่แตกต่างกันเช่นแพทย์ที่แตกต่างกันรักษาโรคเดียวกันของผู้ป่วยรายเดียวกันที่มีสถานะเดียวกันในวิธีที่แตกต่างกัน

ในรูปแบบของรัฐผู้กระทำมีรัฐเช่นรัฐปัจจุบันของผู้ป่วย (พูดที่อุณหภูมิสูงหรืออุณหภูมิต่ำ) ขึ้นอยู่กับการดำเนินการต่อไป (ยาตามใบสั่งแพทย์) จะตัดสินใจและรัฐหนึ่งสามารถนำไปสู่รัฐอื่นดังนั้นจึงมีรัฐ เพื่อรัฐพึ่งพา (องค์ประกอบทางเทคนิค)

หากเราพยายามที่จะเข้าใจในทางเทคนิคโดยอาศัยการเปรียบเทียบโค้ดของทั้งคู่เราอาจสูญเสียความเป็นตัวตนของสถานการณ์เพราะทั้งคู่ดูคล้ายกันมาก


2

ทั้งสองรูปแบบมอบสิทธิ์ให้กับคลาสฐานที่มีอนุพันธ์หลายอย่าง แต่ในรูปแบบของรัฐเท่านั้นที่คลาสอนุพันธ์เหล่านี้จะเก็บการอ้างอิงกลับไปยังคลาสบริบท

อีกวิธีในการดูคือรูปแบบกลยุทธ์เป็นรูปแบบที่เรียบง่ายกว่าของรูปแบบรัฐ รูปแบบย่อยถ้าคุณชอบ มันขึ้นอยู่กับว่าคุณต้องการให้รัฐที่ได้รับเพื่อเก็บการอ้างอิงกลับไปที่บริบทหรือไม่ (เช่น: คุณต้องการให้พวกเขาเรียกวิธีการในบริบท)

สำหรับข้อมูลเพิ่มเติม: โรเบิร์ตซีมาร์ติน (& มิคาห์มาร์ติน) ตอบคำถามนี้ในหนังสือของพวกเขา "หลักการเปรียวรูปแบบและการปฏิบัติใน C #" ( http://www.amazon.com/Agile-Principles-Patterns-Practices-C/dp/0131857258 )


2

นี่เป็นคำถามที่ค่อนข้างเก่า แต่ถึงกระนั้นฉันก็ยังมองหาคำตอบเดียวกันและนี่คือสิ่งที่ฉันค้นพบ

สำหรับรูปแบบของรัฐให้พิจารณาตัวอย่างของปุ่มเล่นของผู้เล่น เมื่อเราเล่นมันจะเริ่มเล่นและทำให้บริบทรับรู้ว่ากำลังเล่นอยู่ ทุกครั้งที่ลูกค้าต้องการดำเนินการเล่นเขาจะตรวจสอบสถานะปัจจุบันของผู้เล่น ตอนนี้ไคลเอนต์ทราบสถานะของวัตถุที่กำลังเล่นผ่านวัตถุบริบทดังนั้นเขาจึงเรียกวิธีการกระทำการหยุดวัตถุสถานะชั่วคราว ส่วนของลูกค้าตระหนักถึงสถานะและสิ่งที่รัฐต้องดำเนินการสามารถเป็นไปโดยอัตโนมัติ

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

ทั้งสองใช้หลักการแบบเปิดเพื่อให้นักพัฒนามีความสามารถในการเพิ่มสถานะใหม่ให้กับรูปแบบสถานะและอัลกอริทึมใหม่

แต่ความแตกต่างคือสิ่งที่พวกเขาใช้นั่นคือรูปแบบของรัฐที่ใช้ในการดำเนินการตรรกะที่แตกต่างกันขึ้นอยู่กับสถานะของวัตถุ และในกรณีของกลยุทธ์ที่แตกต่างกันตรรกะ


2

รัฐมาพร้อมกับการพึ่งพาเพียงเล็กน้อยภายในคลาสที่ได้รับจากรัฐ: เช่นเดียวกับรัฐหนึ่งรู้เกี่ยวกับรัฐอื่น ๆ ที่ตามมา ตัวอย่างเช่นฤดูร้อนมาหลังฤดูหนาวสำหรับทุกฤดูหรือรัฐส่งหลังจากรัฐที่ฝากสำหรับการช็อปปิ้ง

ในทางกลับกันกลยุทธ์ไม่มีการพึ่งพาเช่นนี้ ที่นี่สถานะใด ๆ สามารถเริ่มต้นได้ขึ้นอยู่กับชนิดของโปรแกรม / ผลิตภัณฑ์


1

ความแตกต่างที่จะกล่าวถึงในhttp://c2.com/cgi/wiki?StrategyPattern ฉันใช้รูปแบบกลยุทธ์เพื่ออนุญาตให้อัลกอริทึมที่แตกต่างกันถูกเลือกภายในกรอบงานโดยรวมสำหรับการวิเคราะห์ข้อมูล โดยที่คุณสามารถเพิ่มอัลกอริทึมโดยไม่ต้องเปลี่ยนเฟรมเวิร์กโดยรวมและตรรกะของมัน

ตัวอย่างทั่วไปคือคุณมีกรอบสำหรับการปรับฟังก์ชั่นให้เหมาะสม เฟรมเวิร์กตั้งค่าข้อมูลและพารามิเตอร์ รูปแบบกลยุทธ์ช่วยให้คุณสามารถเลือกอัลกอริธึมเช่น sttepest descents, gradients conjugate, BFGS, ฯลฯ โดยไม่ต้องเปลี่ยนเฟรมเวิร์ก


1

ทั้งรูปแบบกลยุทธ์และรัฐมีโครงสร้างเดียวกัน ถ้าคุณดูไดอะแกรมคลาส UML สำหรับทั้งสองรูปแบบพวกเขาดูเหมือนกันหมด แต่เจตนาของพวกเขานั้นแตกต่างกันโดยสิ้นเชิง รูปแบบการออกแบบของรัฐใช้เพื่อกำหนดและจัดการสถานะของวัตถุในขณะที่รูปแบบกลยุทธ์ใช้เพื่อกำหนดชุดของอัลกอริทึมแบบถอดเปลี่ยนได้และให้ลูกค้าเลือกหนึ่งในนั้น ดังนั้นรูปแบบกลยุทธ์จึงเป็นรูปแบบการขับเคลื่อนของลูกค้าในขณะที่ Object สามารถจัดการสถานะดังกล่าวได้


1

ในระยะสั้นด้วยรูปแบบกลยุทธ์ที่เราสามารถกำหนดพฤติกรรมบางอย่างได้ทันทีด้วยรูปแบบของรัฐเรามั่นใจได้ว่าวัตถุจะเปลี่ยนพฤติกรรมภายในด้วยการเปลี่ยนแปลงของรัฐ


0

เมื่อคุณมีโครงการซึ่งสามารถแบ่งออกเป็น 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 รูปแบบสถานะอนุญาตให้คุณสลับจากสถานะหนึ่งไปอีกรัฐหนึ่ง


0

'กลยุทธ์' เป็นเพียงอัลกอริทึมที่คุณสามารถเปลี่ยนได้ในสถานการณ์ที่แตกต่างกันตามความต้องการของคุณและจะประมวลผลบางอย่างสำหรับคุณ อดีต คุณสามารถเลือกวิธีบีบอัดไฟล์ zip หรือ rar ... ในเมธอด

แต่ 'สถานะ' สามารถเปลี่ยนพฤติกรรมวัตถุทั้งหมดของคุณเมื่อมีการเปลี่ยนแปลงแม้ว่ามันจะสามารถเปลี่ยนฟิลด์อื่น ๆ ... นั่นคือเหตุผลที่มันมีการอ้างอิงถึงเจ้าของ คุณควรสังเกตว่าการเปลี่ยนฟิลด์วัตถุสามารถเปลี่ยนพฤติกรรมของวัตถุได้เลย อดีต เมื่อคุณเปลี่ยน State0 เป็น State1 ใน obj คุณเปลี่ยนจำนวนเต็มเป็น 10 .. ดังนั้นเมื่อเราเรียก obj.f0 () ที่ทำการคำนวณและใช้จำนวนเต็มนั้นมันจะส่งผลต่อผลลัพธ์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.