JavaRush /จาวาบล็อก /Random-TH /ความแตกต่างระหว่างรูปแบบรัฐและยุทธศาสตร์ใน Java
0xFF
ระดับ
Донецк

ความแตกต่างระหว่างรูปแบบรัฐและยุทธศาสตร์ใน Java

เผยแพร่ในกลุ่ม
เพื่อที่จะใช้ รูปแบบ สถานะและกลยุทธ์ในแอปพลิเคชัน Java หลักอย่างเหมาะสม เป็นสิ่งสำคัญที่โปรแกรมเมอร์ Java จะต้องเข้าใจความแตกต่างระหว่างแอปพลิเคชันเหล่านี้อย่างชัดเจน แม้ว่าทั้งรูปแบบ รัฐและยุทธศาสตร์ จะมีโครงสร้างที่คล้ายคลึงกัน และทั้งสองรูปแบบขึ้นอยู่กับหลักการเปิด/ปิด ซึ่งเป็นตัวแทนของ "O" ในหลักการ SOLIDแต่ ทั้งสองมีเจตนาที่แตกต่างกันโดยสิ้นเชิง ความแตกต่างระหว่างรูปแบบรัฐและยุทธศาสตร์ใน Java - 1รูปแบบกลยุทธ์ใน Java ใช้เพื่อสรุปชุดอัลกอริธึมที่เกี่ยวข้องเพื่อให้การดำเนินการมีความยืดหยุ่นแก่ลูกค้า ลูกค้าสามารถเลือกอัลกอริทึมใดๆ ในขณะรันไทม์ได้โดยไม่ต้องเปลี่ยนบริบทของคลาสที่ใช้Strategy. ตัวอย่างยอดนิยมของ รูปแบบ กลยุทธ์คือการเขียนโค้ดที่ใช้อัลกอริธึม เช่น การเข้ารหัส การบีบอัด หรือการเรียงลำดับ ในทางกลับกัน รูปแบบของรัฐอนุญาตให้วัตถุมีพฤติกรรมที่แตกต่างกันในสถานะที่ต่างกัน เนื่องจากในโลกแห่งความเป็นจริง วัตถุมักจะมีสถานะ และวัตถุนั้นมีพฤติกรรมแตกต่างออกไปในสถานะที่ต่างกัน ตัวอย่างเช่น ตู้จำหน่ายสินค้าจะขายสินค้าก็ต่อเมื่อมันอยู่ในสถานะเท่านั้นhasCoinวัตถุนั้นจะไม่ขายจนกว่าคุณจะใส่เหรียญเข้าไป ตอนนี้คุณสามารถเห็นความแตกต่างระหว่างรูปแบบยุทธศาสตร์และรัฐได้อย่างชัดเจน สิ่งเหล่านี้มีความตั้งใจที่แตกต่างกัน รูปแบบสถานะช่วยให้ออบเจ็กต์จัดการสถานะ ในขณะที่รูปแบบกลยุทธ์ช่วยให้ลูกค้าสามารถเลือกพฤติกรรมที่แตกต่างกันได้ ความแตกต่างอีกประการหนึ่งที่เห็นได้ไม่ง่ายนักคือใครเป็นผู้ผลักดันให้เกิดการเปลี่ยนแปลงพฤติกรรม ในกรณีของรูปแบบกลยุทธ์ นี่คือไคลเอนต์ที่ให้กลยุทธ์ที่หลากหลายกับบริบท ในรูปแบบสถานะ การเปลี่ยนแปลงจะถูกควบคุมโดยบริบทหรือสถานะของออบเจ็กต์เอง นอกจากนี้ หากคุณจัดการการเปลี่ยนแปลงสถานะในออบเจ็กต์ State ด้วยตัวเอง จะต้องมีการอ้างอิงถึงบริบท ตัวอย่างเช่น ตู้จำหน่ายสินค้าอัตโนมัติจะต้องสามารถเรียกวิธีsetState()การเปลี่ยนสถานะปัจจุบันของบริบทได้ ในทางกลับกัน ออบเจ็กต์ Strategy ไม่เคยมีการอ้างอิงถึงบริบท ลูกค้าเองส่งผ่าน Strategy ที่เลือกไปยังบริบท ความแตกต่างระหว่างรูปแบบรัฐและกลยุทธ์เป็นหนึ่งในคำถามสัมภาษณ์ยอดนิยมเกี่ยวกับรูปแบบ Javaในบทความเกี่ยวกับรูปแบบ Java นี้เราจะมาดูรายละเอียดกัน เราจะสำรวจความเหมือนและความแตกต่างระหว่างรูปแบบกลยุทธ์และสถานะใน Java ซึ่งจะช่วยให้คุณปรับปรุงความเข้าใจเกี่ยวกับรูปแบบเหล่านี้

ความคล้ายคลึงกันระหว่างรูปแบบรัฐและยุทธศาสตร์

หากคุณดูแผนภาพ UML ของรูปแบบรัฐและกลยุทธ์ คุณจะสังเกตเห็นว่าทั้งสองรูปแบบมีความคล้ายคลึงกัน อ็อบเจ็กต์ที่ใช้สถานะเพื่อเปลี่ยนพฤติกรรมเรียกว่าContext-อ็อบเจ็กต์ ในทำนองเดียวกันอ็อบเจ็กต์ที่ใช้กลยุทธ์เพื่อเปลี่ยนพฤติกรรมเรียกว่า - Contextอ็อบเจ็กต์ โปรดจำไว้ว่าไคลเอนต์โต้ตอบกับContext-object ในกรณีของรูปแบบ State บริบทจะมอบหมายการเรียกวิธีการให้กับออบเจ็กต์ State ซึ่งถือเป็นออบเจ็กต์ปัจจุบัน และในกรณีของรูปแบบ Strategy บริบทจะใช้ออบเจ็กต์ Strategy เป็นพารามิเตอร์หรือถูกจัดเตรียมไว้ในระหว่างการสร้าง ของบริบทของวัตถุ แผนภาพ UML ของรูปแบบ State ใน Java ความแตกต่างระหว่างรูปแบบรัฐและยุทธศาสตร์ใน Java - 2แผนภาพ UML นี้สำหรับรูปแบบ State แสดงให้เห็นถึงปัญหาคลาสสิกของการสร้างการออกแบบเครื่องจำหน่ายสินค้าอัตโนมัติเชิงวัตถุใน Java คุณจะเห็นว่าสถานะของตู้จำหน่ายสินค้าอัตโนมัติแสดงโดยใช้อินเทอร์เฟซ ซึ่งจากนั้นจะมีการนำไปใช้เพื่อแสดงสถานะเฉพาะ แต่ละสถานะยังมีการอ้างอิงถึงบริบทของวัตถุเพื่อทำการเปลี่ยนแปลงไปยังสถานะอื่นอันเป็นผลมาจากการกระทำที่ถูกเรียกในบริบท แผนภาพ UML ของรูปแบบกลยุทธ์ใน Java ความแตกต่างระหว่างรูปแบบรัฐและยุทธศาสตร์ใน Java - 3แผนภาพ UML นี้สำหรับรูปแบบกลยุทธ์ประกอบด้วยการใช้งานประเภทต่างๆ เนื่องจากมีอัลกอริธึมการเรียงลำดับจำนวนมาก รูปแบบการออกแบบนี้จึงทำให้ไคลเอนต์สามารถเลือกอัลกอริธึมเมื่อทำการเรียงลำดับออบเจ็กต์ อันที่จริงแล้วเฟรมเวิร์ก Java Collectionใช้รูปแบบนี้เพื่อนำเมธอดCollections.sort()ที่ใช้ในการเรียงลำดับอ็อบเจ็กต์ใน Java ไป ใช้ ข้อแตกต่างเพียงอย่างเดียวคือ แทนที่จะอนุญาตให้ไคลเอนต์เลือกอัลกอริธึมการเรียงลำดับ กลับอนุญาตให้ระบุกลยุทธ์การเปรียบเทียบโดยส่งอินสแตนซ์ของ Comparator หรืออินเทอร์เฟซที่เปรียบเทียบได้ไปยัง Java มาดูความคล้ายคลึงกันเล็กน้อยระหว่างรูปแบบการออกแบบหลักทั้งสองนี้ใน Java:
  1. ทั้งรูปแบบ รัฐและยุทธศาสตร์ ทำให้ง่ายต่อการเพิ่มสถานะและกลยุทธ์ใหม่ โดยไม่กระทบต่อบริบทของวัตถุที่ใช้

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

  3. เช่นเดียวกับที่บริบทของวัตถุเริ่มต้นด้วยสถานะการเริ่มต้นของวัตถุในรูปแบบสถานะ บริบทของวัตถุก็มีกลยุทธ์เริ่มต้นในกรณีของรูปแบบกลยุทธ์ใน Java

  4. รูปแบบสถานะแสดงถึงพฤติกรรมที่แตกต่างกันในรูปแบบของสถานะของวัตถุที่แตกต่างกัน ในขณะที่รูปแบบกลยุทธ์แสดงถึงพฤติกรรมที่แตกต่างกันในรูปแบบของกลยุทธ์วัตถุที่แตกต่างกัน

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

ความแตกต่างระหว่างรูปแบบกลยุทธ์และสถานะใน Java

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

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

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

  4. การนำกลยุทธ์ไปใช้สามารถส่งผ่านเป็นพารามิเตอร์ไปยังออบเจ็กต์ที่จะใช้ได้ เช่น Collection.sort() รับตัวเปรียบเทียบซึ่งเป็นกลยุทธ์ ในทางกลับกัน สถานะเป็นส่วนหนึ่งของบริบทของวัตถุ และเมื่อเวลาผ่านไป บริบทของวัตถุจะเปลี่ยนจากสถานะหนึ่งไปอีกสถานะหนึ่ง

  5. แม้ว่าทั้งกลยุทธ์และรัฐจะปฏิบัติตามหลักการเปิด/ปิด แต่กลยุทธ์ยังเป็นไปตามหลักการความรับผิดชอบเดียว เนื่องจากแต่ละกลยุทธ์ประกอบด้วยอัลกอริธึมเฉพาะตัว กลยุทธ์ที่แตกต่างกันจะเป็นอิสระจากกัน การเปลี่ยนกลยุทธ์หนึ่งไม่จำเป็นต้องเปลี่ยนอีกกลยุทธ์หนึ่ง

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

  7. ลำดับของการเปลี่ยนสถานะได้รับการกำหนดไว้อย่างดีในรูปแบบรัฐ และไม่มีข้อกำหนดดังกล่าวสำหรับรูปแบบยุทธศาสตร์ ลูกค้ามีอิสระในการเลือกการดำเนินการตามกลยุทธ์ที่เขาเลือก

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

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

ทั้งหมดนี้เกี่ยวกับความแตกต่างระหว่างรูปแบบ State และ Strategy ใน Java อย่างที่ฉันบอกไป ทั้งสองดูคล้ายกันในคลาสและไดอะแกรม UML ทั้งสองมีหลักการเปิด/ปิดและสรุปพฤติกรรม ใช้รูปแบบกลยุทธ์เพื่อสรุปอัลกอริธึมหรือกลยุทธ์ที่เปิดเผยต่อบริบทขณะรันไทม์ อาจเป็นพารามิเตอร์หรือออบเจ็กต์ผสม และใช้รูปแบบสถานะเพื่อควบคุมการเปลี่ยนสถานะใน Java ต้นฉบับที่นี่
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION