2.1 รัฐ
รัฐเป็นรูปแบบการออกแบบพฤติกรรม จะใช้ในกรณีที่ระหว่างการดำเนินการของโปรแกรม วัตถุต้องเปลี่ยนลักษณะการทำงานขึ้นอยู่กับสถานะของมัน
![สถานะ](https://cdn.codegym.cc/images/article/0b64173f-b514-4ae1-a073-6cbb386a5716/800.jpeg)
รูปแบบประกอบด้วย 3 ช่วงตึก:
บริบทคือคลาสที่วัตถุควรเปลี่ยนพฤติกรรมขึ้นอยู่กับสถานะ
สถานะคือส่วนต่อประสานที่แต่ละสถานะที่เป็นรูปธรรมต้องดำเนินการ ผ่านทางอินเทอร์เฟซนี้ วัตถุบริบทโต้ตอบกับรัฐโดยการมอบหมายการเรียกเมธอด อินเทอร์เฟซควรมีวิธีป้อนกลับไปยังวัตถุที่พฤติกรรมต้องการเปลี่ยนแปลง
สำหรับสิ่งนี้ จะใช้ เหตุการณ์ (รูปแบบ Publisher - Subscriber) นี่เป็นสิ่งจำเป็นเพื่อแทนที่วัตถุสถานะระหว่างการดำเนินการของโปรแกรมเมื่อมีเหตุการณ์เกิดขึ้น อาจมีบางกรณีที่ Context สำรวจอ็อบเจกต์สถานะเป็นระยะๆ เพื่อทำการเปลี่ยนผ่าน
ConcreteState1, ConcreteState2 - คลาสของสถานะคอนกรีต ควรมีข้อมูลเกี่ยวกับภายใต้เงื่อนไขใดและในสถานะใดที่วัตถุสามารถผ่านจากสถานะปัจจุบันได้ ตัวอย่างเช่น จาก ConcreteState1 วัตถุสามารถไปที่ ConcreteState2 และ ConcreteState3 และจาก ConcreteState2 กลับไปที่ ConcreteState1 เป็นต้น วัตถุของหนึ่งในนั้นต้องมีบริบทเมื่อสร้าง
ตัวอย่างเช่น คุณกำลังเขียนเกมที่ตัวละครสามารถวิ่ง ว่ายน้ำ และบินได้ หากตัวละครของคุณลงไปในน้ำ ก็มีเหตุผลที่จะจำกัดพฤติกรรมของเขาในน้ำ: ตอนนี้เขาไม่สามารถยิงได้ แต่เขายังมีการกระทำบางอย่าง: ว่ายไปข้างหน้า ขวา ซ้าย ฯลฯ
สถานะของตัวละครของคุณสามารถอธิบายได้ด้วยวัตถุสถานะ ซึ่งมีเมธอดที่สามารถเรียกใช้และจะทำบางสิ่งได้ และหลังจากที่ตัวละครของคุณลงไปในน้ำแล้ว คุณเพียงแค่เปลี่ยนการอ้างอิงไปยังวัตถุสถานะอื่นที่อยู่ในนั้น - และมันก็จะเปลี่ยนสถานะของมัน
2.2 กลยุทธ์
กลยุทธ์คือรูปแบบการออกแบบเชิงพฤติกรรมสำหรับกำหนดกลุ่มของอัลกอริทึม ห่อหุ้มแต่ละกลุ่ม และทำให้สามารถใช้แทนกันได้ สิ่งนี้ช่วยให้คุณเลือกอัลกอริทึมโดยกำหนดคลาสที่เหมาะสม
รูปแบบกลยุทธ์ช่วยให้คุณเปลี่ยนอัลกอริทึมที่เลือกโดยไม่คำนึงถึงวัตถุไคลเอนต์ที่ใช้
![กลยุทธ์](https://cdn.codegym.cc/images/article/673c4c44-ec33-4d4e-860f-399abc388d8d/800.jpeg)
รูปแบบกลยุทธ์ช่วยให้คุณใช้กฎทางธุรกิจหรืออัลกอริทึมที่แตกต่างกันได้ ขึ้นอยู่กับบริบท ใช้ในกรณีที่ต้องใช้อัลกอริทึมที่แตกต่างกันในที่เดียวกันโดยขึ้นอยู่กับสถานะปัจจุบันของระบบ (หรือสภาพแวดล้อม)
จุดแข็ง:
- การห่อหุ้มการดำเนินการของอัลกอริทึมต่างๆ ระบบจะเป็นอิสระจากการเปลี่ยนแปลงที่เป็นไปได้ในกฎทางธุรกิจ
- เรียกอัลกอริทึมทั้งหมดด้วยวิธีมาตรฐานเดียว
- ไม่ใช้คำสั่งสวิตช์และ/หรือเงื่อนไข
รูปแบบนี้ค่อนข้างคล้ายกับรูปแบบของรัฐ แต่ที่นี่ไม่ได้เน้นที่สถานะ แต่อยู่ที่พฤติกรรม สมมติว่าตัวละครในเกมของคุณสามารถเปลี่ยนอาวุธได้ จากนั้นเมื่อเปลี่ยนอาวุธ คุณสามารถเปลี่ยนการอ้างอิงไปยังวัตถุที่อธิบายวิธีการทำงานของอาวุธนี้ได้
2.3 วิธีแม่แบบ
![วิธีแม่แบบ](https://cdn.codegym.cc/images/article/be4df3de-e667-4f4d-9ea7-d3b021879bb2/800.jpeg)
คลาสนามธรรม (คลาสนามธรรม) - กำหนดการดำเนินการนามธรรมที่ถูกแทนที่ในทายาทเพื่อใช้ขั้นตอนของอัลกอริทึม ใช้วิธีการเทมเพลตที่กำหนดโครงกระดูกของอัลกอริทึม เมธอดเทมเพลตเรียกการดำเนินการที่ถูกแทนที่และอื่นๆ ที่กำหนดไว้ในคลาส Abstract
คลาสคอนกรีต (คลาสคอนกรีต) - ใช้การดำเนินการที่ถูกแทนที่ในลักษณะที่จำเป็นสำหรับการใช้งาน คลาส Concrete จะถือว่าขั้นตอนที่ไม่แปรผันของอัลกอริทึมจะดำเนินการใน AbstractClass
รูปแบบนี้มักใช้เมื่อจำเป็น:
- การใช้อัลกอริทึมที่ไม่แปรเปลี่ยนเพียงส่วนเดียว ปล่อยให้ส่วนที่เปลี่ยนแปลงขึ้นอยู่กับดุลยพินิจของทายาท
- การแปลเป็นภาษาท้องถิ่นและการแยกโค้ดที่ใช้ร่วมกันในหลายคลาสเพื่อหลีกเลี่ยงการทำซ้ำ
- อนุญาตให้ผู้สืบทอดขยายรหัสในบางสถานที่เท่านั้น
ใช่ รูปแบบนี้อธิบายการใช้คู่: คลาสนามธรรมและการนำไปใช้
2.4 ห่วงโซ่ความรับผิดชอบ
ห่วงโซ่ความรับผิดชอบคือรูปแบบการออกแบบเชิงพฤติกรรมที่ออกแบบมาเพื่อจัดระเบียบระดับความรับผิดชอบในระบบ
![ห่วงโซ่ความรับผิดชอบ](https://cdn.codegym.cc/images/article/41b55822-dc67-4db3-a0e8-b467bc9f320d/800.jpeg)
ขอแนะนำให้ใช้แม่แบบในสภาวะที่:
- ในระบบที่พัฒนาแล้วมีกลุ่มของวัตถุที่สามารถประมวลผลข้อความบางประเภทได้
- ข้อความทั้งหมดต้องถูกประมวลผลโดยออบเจกต์ระบบอย่างน้อยหนึ่งรายการ
- ข้อความในระบบได้รับการประมวลผลตามรูปแบบ "ดำเนินการเองหรือส่งต่อไปยังที่อื่น" นั่นคือข้อความบางข้อความได้รับการประมวลผลในระดับที่ได้รับในขณะที่ข้อความอื่น ๆ จะถูกส่งต่อไปยังวัตถุในระดับอื่น
2.5 ของที่ระลึก
Keeper (Memento)เป็นรูปแบบการออกแบบเชิงพฤติกรรมที่ให้คุณแก้ไขและบันทึกสถานะภายในของออบเจกต์โดยไม่ละเมิดการห่อหุ้ม เพื่อให้สามารถเรียกคืนสถานะนี้ในภายหลังได้
![ผู้พิทักษ์ (ของที่ระลึก)](https://cdn.codegym.cc/images/article/9b1d2d68-74b7-427c-8d7b-cf44640cf51f/800.jpeg)
รูปแบบ Guardian จะใช้เมื่อ:
- จำเป็นต้องบันทึกสแนปชอตของสถานะของวัตถุ (หรือบางส่วน) สำหรับการคืนค่าในภายหลัง
- อินเทอร์เฟซโดยตรงสำหรับการรับสถานะของอ็อบเจ็กต์เปิดเผยรายละเอียดการใช้งานและแบ่งการห่อหุ้มอ็อบเจ็กต์