1. Kompozit desen nedir

Kompozit Desen, yaygın olarak kullanılan bir nesne yapısal tasarım desenidir. Nesneleri bir ağaç yapısına birleştirerek hiyerarşik "bütün-bölünmüş" ilişkiyi temsil etmeye olanak tanır ve istemcilere bireysel nesneleri ve nesne kompozisyonlarını tutarlı bir şekilde işlemelerini sağlar.

2. Kompozit desenin özellikleri ve avantajları

Kompozit deseninin temel avantajları şunlardır:

  1. Hiyerarşik karmaşık nesneleri net bir şekilde tanımlayabilir, nesne hiyerarşisinin tamamını veya bir kısmını temsil ederek yeni bileşenler eklemeyi kolaylaştırır.
  2. Birleşik parçalara ve bireysel nesnelere erişimi standart hale getirerek istemcilerin tekli nesneleri ve bileşik nesneleri eşit şekilde kullanmasını sağlayan birleşik bir arayüz sağlar.

3. Kompozit desenin uygulama senaryoları

  1. Nesne bütün-bölünmüş hiyerarşisini temsil etmek istediğinizde.
  2. İstemcilerin bileşik nesneler ile bireysel nesneler arasındaki farkları yok saymalarını ve bileşik yapıdaki tüm nesneleri eşit şekilde kullanmalarını istediğinizde.

4. Golang'da kompozit desenin uygulanması

Diyelim ki bir e-ticaret uygulaması tasarlıyoruz, ürün kataloğu kompozit desenin iyi bir örneğidir. Bir kategori diğer kategorileri ve aynı zamanda ürünleri içerebilir (örneğin elektronik kategorisi telefonlar, bilgisayarlar içerir ve telefonlar iPhone, Samsung telefonlar gibi ürünleri içerir).

4.1 UML Sınıf Diyagramı

Golang'da Kompozit Desen

4.2 Örnek Tanıtımı

Bu örnekte, soyut bir temel sınıf olarak Component (açıkça nesne yönelimli programlamanın arayüz özelliğini kullanan) ve Composite ile Leaf her ikisi de bu arabirimi uygular, sırasıyla konteyner nesneleri ve temel nesneleri temsil eder.

4.3 Uygulama Adımı 1: Soyut bileşen sınıfını tanımlamak

Bu yöntem genellikle arayüz sınıfında tanımlanır ve ana merkezi bir işlemdir.

4.3.1 Soyut bileşen sınıfının arabirimini tanımlamak

//Component: Temel bileşen arayüzü, grupların ve bireylerin ortaklığını tanımlar
type Component interface {
    Search(string)
}

4.3.2 Soyut bileşen sınıfının temel yöntemlerini uygulamak

Bu adım özellikle konteyner bileşen sınıfında ve yaprak bileşen sınıfında uygulanır.

4.4 Uygulama Adımı 2: Yaprak bileşen sınıfını tanımlamak

Bu somut sınıf, hiyerarşide alt kategori veya nesneyi temsil eder ve sonraki katmana nesneleri içermez.

4.4.1 Soyut bileşen sınıfından miras almak

Go'da, arayüz mirası, Yapılar aracılığıyla yöntemlerin nasıl uygulandığıyla gerçekleştirilir.

4.4.2 Yaprak bileşen sınıfına özgü yöntemleri uygulamak

//Product: Bir yaprak düğümü olan bir ürünü temsil eder ve alt düğümlere sahip olamaz
type Product struct {
    Name string
}

//Search: Ürünleri ara
func (p *Product) Search(keyword string) {
    if strings.Contains(p.Name, keyword) {
        fmt.Printf("Ürün: '%s' kelimeyi içerir: '%s'\n", p.Name, keyword)
    }
}

4.5 Uygulama Adımı 3: Konteyner bileşen sınıfını tanımlamak

Bu sınıf, çocuk nesneleri depolamak ve yönetmek için kullanılır, genellikle çocuk nesneleri yönetme ve düzenleme yöntemlerini içerir, örneğin add(Component), remove(Component) vb.

4.5.1 Soyut bileşen sınıfından miras almak

Bu da Go'da arayüz yöntemlerini uygulamak için Yapılar kullanılarak gerçekleştirilir.

4.5.2 Konteyner Bileşen Sınıfına Özgü Yöntemleri Uygulamak

// Category: Bir konteyner düğümünü temsil eder, yani ürün kategorisi, çocuk düğümlere sahip olabilir
type Category struct {
    Name     string
    Children []Component
}

// Ekle: Bir çocuk düğüm ekler
func (c *Category) Add(child Component) {
    c.Children = append(c.Children, child)
}

// Kaldır: Bir çocuk düğümü kaldırır
func (c *Category) Remove(child Component) {
    // Özel uygulama atlandı
}

// Ara: Ürünleri ara
func (c *Category) Search(keyword string) {
    fmt.Printf("Kategori: %s\n", c.Name)
    for _, composite := range c.Children {
        composite.Search(keyword)
    }
}

4.6 Uygulama Adımı 4: İstemci Kodu Örneği

Bir yapıyı örnekleyin, onu bir ağaç yapısına monte edin ve ardından ağaç yapısının erişim işlemini çağırın.

func main() {
    root := &Category{Name: "Kök"}
    elektronik := &Category{Name: "Elektronik"}

    telefon := &Product{Name: "Telefon"}
    tv := &Product{Name: "Televizyon"}

    root.Add(elektronik)
    elektronik.Add(telefon)
    elektronik.Add(tv)

    root.Search("telefon") // Bu tüm alt öğelerde arama yapacaktır
}