ข้ามไปยังเนื้อหา

Behavioral Patterns I

Behavioral patterns อธิบายว่า object คุยกันอย่างไร ใครถือความรับผิดชอบใด คำขอเดินทางจากผู้ส่งไปยังผู้จัดการอย่างไร และผู้ร่วมงานคงการประสานกันไว้อย่างไรขณะที่โปรแกรมทำงาน ที่ creational patterns ตอบว่า object ถือกำเนิดขึ้นมาอย่างไร และ structural patterns ตอบว่า object ประกอบกันอย่างไร นั้น behavioral patterns ตอบว่า object ประพฤติร่วมกันอย่างไรเมื่อเวลาผ่านไป

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

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

โมดูลนี้ครอบคลุม behavioral patterns หลักหกตัว อีกห้าตัว ได้แก่ Mediator, Chain of Responsibility, Visitor, Memento และ Interpreter อยู่ในโมดูลถัดไป Behavioral Patterns II

classDiagram
  class BehavioralPattern {
    <<concept>>
    +coordinate()
  }
  class Strategy {
    +execute()
  }
  class Observer {
    +notify()
  }
  class Command {
    +execute()
    +undo()
  }
  class State {
    +handle()
  }
  class TemplateMethod {
    +run()
  }
  class Iterator {
    +next()
  }
  BehavioralPattern <|.. Strategy
  BehavioralPattern <|.. Observer
  BehavioralPattern <|.. Command
  BehavioralPattern <|.. State
  BehavioralPattern <|.. TemplateMethod
  BehavioralPattern <|.. Iterator
behavioral patterns หลักหกตัวและบทบาทร่วมของแต่ละตัว

ภาพรวมของหก pattern โดยสังเขป:

  • Strategy — รวบรวมตระกูลของอัลกอริทึมที่สับเปลี่ยนกันได้ไว้หลัง interface เดียว เพื่อให้การเลือกอัลกอริทึมผันแปรได้อย่างเป็นอิสระจาก code ที่เรียกใช้
  • Observer — ยอมให้ subject แจ้งเตือนกลุ่มผู้พึ่งพาที่เปลี่ยนแปลงได้โดยอัตโนมัติเมื่อใดก็ตามที่สถานะของตัวเองเปลี่ยน โดยไม่ต้องรู้ว่าพวกเขาเป็นใคร
  • Command — เปลี่ยนคำขอให้เป็น object ที่ยืนได้ด้วยตัวเอง ซึ่งทำให้คำขอสามารถเข้าคิว บันทึก log และย้อนกลับผ่าน undo ได้
  • State — ยอมให้ object เปลี่ยนพฤติกรรมเมื่อสถานะภายในเปลี่ยน จนดูเหมือนสลับ class ในขณะรันแทนที่จะแตกแขนงตามแฟล็ก
  • Template Method — ตรึงโครงร่างของอัลกอริทึมไว้ใน class หลัก แล้วเปิดให้ subclass override ขั้นตอนแต่ละขั้นได้
  • Iterator — ให้การเข้าถึงสมาชิกของคอลเล็กชันตามลำดับโดยไม่เปิดเผยว่าคอลเล็กชันเก็บข้อมูลไว้อย่างไร
  • ข้อดี: แต่ละ pattern แยกความเปลี่ยนแปลงชนิดหนึ่งออกมา พฤติกรรมจึงวิวัฒน์ได้โดยไม่กระเพื่อมไปทั่ว code ที่ไม่เกี่ยวข้อง
  • ข้อดี: pattern เหล่านี้แทนที่เงื่อนไขที่บานปลายและห่วงโซ่การเรียกที่แข็งทื่อด้วยผู้ร่วมงานเล็ก ๆ ที่มีชื่อและทดสอบได้
  • ข้อเสีย: ทุก pattern เพิ่ม object และชั้นการอ้อม สำหรับตรรกะเรียบง่ายการเรียกตรง ๆ หรือลูปธรรมดาจะชัดเจนกว่า
  • ข้อเสีย: การใช้มากเกินไปกระจายพฤติกรรมไปทั่ว class จิ๋วจำนวนมาก ซึ่งอาจบดบังภาพการไหลโดยรวมได้