1. คือการออกแบบแบบสมุดรวม (Composite Pattern)
แบบสมุดรวม (Composite Pattern) เป็นแบบสร้างรูปแบบของออบเจกต์ที่ใช้กันอย่างแพร่หลาย มันรวมออบเจกต์เข้าด้วยกันในโครงสร้างต้นไม้เพื่อแทนความสัมพันธ์ "ส่วน-ทั้ง" ในลักษณะลำดับชั้น ให้ลูกค้าสามารถจัดการออบเจกต์แต่ละอันและการรวมออบเจกต์ในลักษณะที่สอดคล้องกัน
2. ลักษณะและข้อดีของแบบสมุดรวม (Composite Pattern)
ข้อดีหลักของแบบสมุดรวม (Composite Pattern) คือ:
- สามารถนิยามวัตถุต้นไม้ที่ซับซ้อนได้อย่างชัดเจน แทนที่วัตถุทั้งหมดหรือบางส่วนของโครงสร้างวัตถุ ทำให้ง่ายต่อการเพิ่มคอมโพเนนต์ใหม่
- มีอินเตอร์เฟซที่เป็นเอกลักษณ์ ทำให้การเข้าถึงคุณสมบัติของคอมโพเนนต์และวัตถุรายบุคคลสามารถสอดคล้องกัน ทำให้ลูกค้าสามารถใช้ออบเจกต์เดี่ยวและออบเจกต์รวมได้อย่างสม่ำเสมอ
3. สถานการณ์การประยุกต์ใช้ของแบบสมุดรวม (Composite Pattern)
- เมื่อคุณต้องการแทนความสัมพันธ์ระหว่างส่วนทั้งของวัตถุ
- เมื่อคุณต้องการให้ลูกค้าละเมืองความแตกต่างระหว่างวัตถุรวมและวัตถุรายบุคคล และใช้ออบเจกต์ทั้งหมดในโครงสร้างวัตถุได้อย่างสม่ำเสมอ
4. การประยุกต์ใช้ของแบบสมุดรวม (Composite Pattern) ใน Golang
สมมติว่าเรากำลังออกแบบแอพพลิเคชันอีคอมเมิร์ซ เพียงชั้นหนึ่งของผลิตภัณฑ์คือตัวอย่างดีสำหรับแบบสมุดรวม หมวดหมู่สามารถมีหมวดหมู่อื่น ๆ และสินค้า (เช่น หมวดหมู่อิเล็กทรอนิกส์มีโทรศัพท์ คอมพิวเตอร์ และโทรศัพท์มี iPhone, โทรศัพท์ Samsung เป็นต้น)
4.1 ไดอะแกรมคลาส UML
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") // คำสั่งนี้จะค้นหาในลูกทั้งหมด
}