มาพูดถึงรูปแบบการออกแบบกลยุทธ์กันเถอะ!
รูปแบบการออกแบบนี้ช่วยให้คุณเปลี่ยนอัลกอริทึมหลักภายในวิธีการได้
คุณทำได้โดยส่งผ่านคลาสที่ใช้อัลกอริทึมนี้ แทนที่จะฮาร์ดโค้ดลงในคลาส
และเมื่อฉันพูด อัลกอริทึม ฉันไม่ได้หมายถึงอัลกอริธึมวิทยาการคอมพิวเตอร์แฟนซี แต่โค้ดใดๆ ที่ทำตามขั้นตอนตามลำดับเพื่อให้ได้ผลลัพธ์
เมื่อใดควรใช้รูปแบบกลยุทธ์
รูปแบบนี้แก้ปัญหาอะไรกันแน่?
ปัญหาหลักการเปิด/ปิด
หลักการนี้กล่าวว่า:
“ซอฟต์แวร์เอนทิตี (คลาส โมดูล เมธอด) ควรเปิดเพื่อขยายและปิดเพื่อแก้ไข”
ซึ่งหมายความว่าเพื่อให้ชั้นเรียนทำสิ่งใหม่ ๆ คุณไม่จำเป็นต้องเปลี่ยนชั้นเรียนเอง ซึ่งจะทำให้โค้ดของคุณมีความยืดหยุ่นและแข็งแกร่งมากขึ้นไปพร้อม ๆ กัน
แต่คุณจะทำอย่างไรให้สำเร็จ?
การใช้รูปแบบการออกแบบ เช่น รูปแบบกลยุทธ์ 🙂
สมมติว่าคุณมี ReportGenerator
และคุณต้องการสร้างรูปแบบรายงานหลายประเภทโดยใช้ข้อมูลเดียวกัน
คุณสามารถเขียนวิธีการสำหรับรายงานแต่ละประเภทได้ แต่นั่นหมายความว่าคุณต้องเปลี่ยนชั้นเรียน (โดยการเพิ่มวิธีการใหม่) ทุกครั้งที่คุณต้องการเพิ่มประเภทใหม่ ทำลายหลักการเปิด/ปิด
หรือแย่กว่านั้นอีก!
คุณสามารถมีวิธีการขนาดใหญ่เพียงวิธีเดียวด้วยคำสั่ง if ทุกประเภท… ซึ่งมักจะจบลงได้ไม่ดีนัก
แต่ถ้าชั้นเรียนไม่จำเป็นต้องรู้วิธีจัดรูปแบบรายงานล่ะ
จะเกิดอะไรขึ้นหากอัลกอริทึมมาจาก นอกชั้นเรียน ?
จากนั้นเราสามารถเปลี่ยนอัลกอริทึมการจัดรูปแบบได้ทุกเมื่อที่ต้องการโดยไม่ต้องเปลี่ยนคลาสเอง
วิธีนี้ช่วยแก้ปัญหาได้
และนั่นคือสิ่งที่รูปแบบกลยุทธ์ คือทั้งหมดที่เกี่ยวกับ
ตัวอย่างรูปแบบกลยุทธ์
กลยุทธ์ถูกนำไปใช้ในรูปแบบของคลาสด้วยวิธีเดียว
นี่คือกลยุทธ์การจัดรูปแบบบางส่วนสำหรับ ReportGenerator
คลาส:
require 'json' module ReportFormatters class JSON def self.format(data) data.to_json end end class PlainText def self.format(data) data.to_s end end class HTML def self.format(data) html = "" html << "
- "
data.each { |product, amount| html << "
- #{product}: #{amount} " } html << "
สังเกตว่ากลยุทธ์ทั้งหมดใช้ format
กระบวนการ. เมธอดนี้จะถูกเรียกโดยคลาสตัวสร้างรายงาน
นี่คือรหัส :
class ReportGenerator def self.generate(data, formatter) formatter.format(data) end end data = { onions: 31, potatoes: 24, eggs: 10 } p ReportGenerator.generate(data, ReportFormatters::HTML) p ReportGenerator.generate(data, ReportFormatters::JSON) p ReportGenerator.generate(data, ReportFormatters::PlainText)
ตอนนี้:
หากคุณต้องการเปลี่ยนรูปแบบเอาต์พุต (จาก HTML
เป็น PlainText
) คุณเพียงแค่ต้องผ่านกลยุทธ์อื่น &มันจะใช้งานได้ตราบใดที่กลยุทธ์ใช้ format
วิธีการ
อีกวิธีในการคิดเกี่ยวกับรูปแบบนี้คือ คุณกำลังจ้างที่ปรึกษาที่เชี่ยวชาญในกลยุทธ์ทางธุรกิจเฉพาะ ที่ปรึกษาจะเข้ามา &นำกลยุทธ์ไปใช้ สำหรับคุณแล้ว กลยุทธ์นี้จะให้ผลลัพธ์ที่เฉพาะเจาะจง
ในทางตรงกันข้าม รูปแบบอย่างลวดลายมัณฑนากรก็เหมือนการเพิ่มเครื่องประดับใหม่ให้กับต้นคริสต์มาสเพื่อให้ดูฉูดฉาดยิ่งขึ้น
คุณสามารถทำงานกับกลยุทธ์ได้ครั้งละ 1 กลยุทธ์เท่านั้น แต่คุณสามารถมีเครื่องประดับได้มากเท่าที่คุณต้องการ
วิดีโอ
สรุป
คุณได้เรียนรู้เกี่ยวกับรูปแบบการออกแบบกลยุทธ์แล้ว ใช้เมื่อคุณต้องการเปลี่ยนบางส่วนของสิ่งที่ชั้นเรียนทำโดยไม่ต้องเปลี่ยนชั้นเรียนเอง
ขอบคุณสำหรับการอ่าน!
อย่าลืมแชร์โพสต์นี้ บน Twitter หากคุณพบว่ามัน น่าสนใจ , มันจะช่วยให้คนสนุกมากขึ้นด้วย 🙂