1. คือการออกแบบแบบสมุดรวม (Composite Pattern)

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

2. ลักษณะและข้อดีของแบบสมุดรวม (Composite Pattern)

ข้อดีหลักของแบบสมุดรวม (Composite Pattern) คือ:

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

3. สถานการณ์การประยุกต์ใช้ของแบบสมุดรวม (Composite Pattern)

  1. เมื่อคุณต้องการแทนความสัมพันธ์ระหว่างส่วนทั้งของวัตถุ
  2. เมื่อคุณต้องการให้ลูกค้าละเมืองความแตกต่างระหว่างวัตถุรวมและวัตถุรายบุคคล และใช้ออบเจกต์ทั้งหมดในโครงสร้างวัตถุได้อย่างสม่ำเสมอ

4. การประยุกต์ใช้ของแบบสมุดรวม (Composite Pattern) ใน Golang

สมมติว่าเรากำลังออกแบบแอพพลิเคชันอีคอมเมิร์ซ เพียงชั้นหนึ่งของผลิตภัณฑ์คือตัวอย่างดีสำหรับแบบสมุดรวม หมวดหมู่สามารถมีหมวดหมู่อื่น ๆ และสินค้า (เช่น หมวดหมู่อิเล็กทรอนิกส์มีโทรศัพท์ คอมพิวเตอร์ และโทรศัพท์มี iPhone, โทรศัพท์ Samsung เป็นต้น)

4.1 ไดอะแกรมคลาส UML

แบบสมุดรวมใน Golang

4.2 การนำเสนอตัวอย่าง

ในตัวอย่างนี้ เรามี Component (โดยแน่นอนใช้คุณสมบัติอินเตอร์เฟซของการเรียกออบเจกต์) เป็นฐานหลักทางนามวาบและ Composite และ Leaf ทั้งสองสิ่งที่ต้องการซื้อคุณสมบัตินี้ แทนออบเจกต์คอนเทนเนอร์และออบเจกต์พื้นฐานตามลำดับ

4.3 ขั้นตอนการประยุกต์ใช้ส่วนที่ 1: นิยามของคลาสอุปกรณ์นามวาบ

4.3.1 นิยามอินเตอร์เฟซของคลาสองปกรณ์นามวาบ

//Component: อินเตอร์เฟซของคอมโพเนนต์พื้นฐาน นิยายคุณสมบัติร่วมโดยทั่วไปของกลุ่มและรายบุคคล
type Component interface {
    Search(string)
}

4.3.2 นำแนวทางพื้นฐานของคลาสอุปกรณ์นามวาบ

ขั้นตอนนี้มักจะถูกนิยายไว้ในคลาสอินเตอร์เฟซและเป็นการดำเนินงานพื้นฐานสำคัญ

4.4 ขั้นตอนการประยุกต์ใช้ 2: นิยายคลาสอุปกรณ์พื้นฐาน

คลาสคอนกรีตนี้แสดงหมวดหมู่ที่หลังสุดหรือวัตถุในลำดับชั้น และมันไม่มีวัตถุชั้นถัดไป

4.4.1 สืบทอดจากคลาสอุปกรณ์นามวาบ

ใน Go การสืบทอดอินเตอร์เฟซ ดำเนินการโดยวิธีการที่วิธีการนั้นเข้าร่วมผ่าน Struct

4.4.2 การนำแนวทางพื้นฐานของคลาสอุปกรณ์ชั้นพื้นฐาน

//Product: แทนโหนดใบไม้ ก็คือสินค้าและไม่สามารถมีโหนดลูกได้
type Product struct {
    Name string
}

//Search: ค้นหาสินค้า
func (p *Product) Search(keyword string) {
    if strings.Contains(p.Name, keyword) {
        fmt.Printf("สินค้า: '%s' มีคำสำคัญ:'%s'\n", p.Name, keyword)
    }
}

4.5 ขั้นตอนการประยุกต์ใช้ 3: นิยายคลาสอุปกรณ์คอนเทนเนอร์

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

4.5.1 สืบทอดจากคลาสอุปกรณ์นามวาบ

นี้ยังถูกนำแนวทางผ่าน Struct เพื่อซอฟต์แอินเตอร์เฟซแมสถิตอย่างสมบูรณ์ใน Go

4.5.2 การนำแนวทางพื้นฐานของคลาสอุปกรณ์คอนเทนเนอร์

// Category: แทนโหนดคอนเทนเนอร์ ก็คือหมวดหมู่ของสินค้า ซึ่งสามารถมีโหนดลูก
type Category struct {
    Name     string
    Children []Component
}

// Add: เพิ่มโหนดลูก
func (c *Category) Add(child Component) {
    c.Children = append(c.Children, child)
}

// Remove: ลบโหนดลูก
func (c *Category) Remove(child Component) {
    // การนำแนวทางที่เฉพาะเจาะจงนั้นจะถูกข้ามไป
}

// Search: ค้นหาสินค้า
func (c *Category) Search(keyword string) {
    fmt.Printf("หมวดหมู่: %s\n", c.Name)
    for _, composite := range c.Children {
        composite.Search(keyword)
    }
}

4.6 ขั้นตอนการสร้างโครงสร้าง ขั้นที่ 4: ตัวอย่างโค้ดของไคลเอ็นต์

สร้างโครงสร้าง และเรียกใช้งานการเข้าถึงของโครงสร้างต้นไม้

func main() {
    root := &Category{Name: "Root"}
    electronics := &Category{Name: "Electronics"}

    phone := &Product{Name: "Phone"}
    tv := &Product{Name: "Television"}

    root.Add(electronics)
    electronics.Add(phone)
    electronics.Add(tv)

    root.Search("phone") // คำสั่งนี้จะค้นหาในลูกทั้งหมด
}