Yazılım geliştirmede örüntüler: bileşik örüntü

Adanali

Active member
Yazılım geliştirmede örüntüler: bileşik örüntü


  1. Yazılım geliştirmede örüntüler: bileşik örüntü

Kalıplar, modern yazılım geliştirmede önemli bir soyutlamadır. İyi tanımlanmış terminoloji, açık belgeler sunar ve en iyisinden öğrenirler. Desen serimde öne çıkardığım “Design Patterns: Elements of Reusable Object-Oriented Software” (kısaca Design Patterns) adlı klasik kitap 23 desen içeriyor. Bileşik model, nesneleri ağaç yapılarında oluşturmanıza ve tek ve bileşik nesneleri tutarlı bir şekilde işlemenize olanak tanır.







Rainer Grimm, uzun yıllardır yazılım mimarı, ekip lideri ve eğitim yöneticisi olarak çalışmaktadır. C++, Python ve Haskell programlama dilleri üzerine makaleler yazmaktan hoşlanır, aynı zamanda sık sık uzmanlık konferanslarında konuşmaktan da keyif alır. Modernes C++ blogunda yoğun bir şekilde C++ tutkusundan bahsediyor.













Bileşik desen, son yazımda sunduğum Dekoratör desenine çok benziyor. Her iki model de doğası gereği yapısaldır. Temel fark, Bileşik desenin ağaç yapıları oluşturması, Dekoratör deseninin ise yalnızca bir nesne oluşturmasıdır.

İşte Kompozit model hakkında daha fazla ayrıntı.

bileşik model


amaç

  • Ağaç yapılarındaki nesneleri birleştirerek onlara eşit şekilde davranın

kullanım durumu

  • Kısmi/tam hiyerarşileri temsil eder
  • Müşteriler, tek ve bileşik nesneleri aynı şekilde ele alabilir
çerçeve








Component

  • Arayüzü tanımlar
  • Bir arayüz tanımlar, böylece dosya Composite (ebeveyn), bileşeninin alt öğesine erişebilir (isteğe bağlı)
Leaf

  • Tek nesneyi temsil eder
  • Arayüzü uygula
Composite

  • Bileşik nesneyi temsil eder
  • Alt öğelerini manipüle etmek için üye işlevleri tanımlar
Ağaç işlemleri, bir yaprak düğümde veya bir bileşik düğümde gerçekleştirilebilir. Bu, bir yaprak düğüm ise doğrudan yapılır. Bileşik bir düğüm ise, işlem tüm alt bileşenlere atanır. Bileşik bir düğüm, bunları eklemek veya kaldırmak için alt öğeler ve üye işlevlerin bir listesine sahiptir. Sonuç olarak, her bileşen (yaprak düğüm veya bileşik düğüm) işlemi buna göre işleyebilir.

misal



// composite.cpp

#include <iostream>
#include <string>
#include <vector>

class Graphic {
public:
virtual void print() const = 0;
virtual ~Graphic() {}
};

class GraphicComposite : public Graphic {
std::vector<const Graphic*> children; // (1)
const std::string& name;
public:
explicit GraphicComposite(const std::string& n): name(n){}
void print() const override { // (5)
std::cout << name << " ";
for (auto c: children) c->print();
}

void add(const Graphic* component) { // (2)
children.push_back(component);
}

void remove(const Graphic* component) { // (3)
std::erase(children, component);
}
};

class Ellipse: public Graphic {
private:
const std::string& name;
public:
explicit Ellipse(const std::string& n): name (n) {}
void print() const override { // (4)
std::cout << name << " ";
}
};

int main(){

std::cout << 'n';

const std::string el1 = "ellipse1";
const std::string el2 = "ellipse2";
const std::string el3 = "ellipse3";
const std::string el4 = "ellipse4";

Ellipse ellipse1(el1);
Ellipse ellipse2(el2);
Ellipse ellipse3(el3);
Ellipse ellipse4(el4);

const std::string graph1 = "graphic1";
const std::string graph2 = "graphic2";
const std::string graph3 = "graphic3";

GraphicComposite graphic1(graph1);
GraphicComposite graphic2(graph2);
GraphicComposite graphic(graph3);

graphic1.add(&ellipse1);
graphic1.add(&ellipse2);
graphic1.add(&ellipse3);

graphic2.add(&ellipse4);

graphic.add(&graphic1);
graphic.add(&graphic2);

graphic1.print();
std::cout << 'n';

graphic2.print();
std::cout << 'n';

graphic.print(); // (6)

std::cout << 'n';

graphic.remove(&graphic1);
graphic.print(); // (7)

std::cout << "nn";

}



Bu örnekte tanımlanmış Graphic tüm beton bileşenler için arayüz. GraphicComposite bileşik düğüm e anlamına gelir Ellipse yaprak düğümü anlamına gelir. GraphicComposite çocuklarını bir arada saklar std::vector<const Graphic*> (1) ve çocukları (2 ve 3) ekleme ve çıkarma işlemlerini destekler.

Her bileşenin tamamen sanal bir işlevi olmalıdır print uygulamak. the Ellipse adlarını görüntüleyin (4). GraphicComposite ayrıca adını gösterir, ancak aynı zamanda çağrılmasını delege eder show çocuklarına (5).

Ana program, kök ile bir ağaç yapısı oluşturur. graphic. Ağaç graphic önce alt ağaçla başlayacak grahpic1 (6) ve sonra onsuz (7).

Aşağıdaki ekran görüntüsü programın çıktısını göstermektedir:








bilinen kullanımlar

gibi bir algoritma uygulayarak find veya find_if Standart Şablon Kitaplığı kapsayıcısında, Bileşik kalıbın basitleştirilmiş bir uygulaması olarak görülebilir. Bu, özellikle kap şu şekilde sipariş edilen bir ilişkisel kapsayıcı olduğunda geçerlidir: std::map dır-dir.

İlgili modeller

  • Dekoratör deseni yapısal olarak Bileşik desene benzer. Temel fark, Dekoratör modelinin yalnızca bir çocuğu olmasıdır. Ayrıca, Dekoratör modeli bir nesneye yeni sorumluluklar eklerken Bileşik model, alt öğelerinin sonuçlarını özetler.
  • Yineleyici modeli genellikle ağaç bileşenlerini yinelemek için kullanılır.
  • Ziyaretçi modeli, bir nesnedeki ağaç bileşenlerine uygulanan işlemleri kapsar.
Kompozit modelin artıları ve eksileri ne olacak?

Avantajlar ve dezavantajlar

Faydalarından başlayayım.

faydalar

  • Polimorfizm ve özyineleme sayesinde, karmaşık ağaç yapıları tek tip olarak ele alınabilir.
  • Ağaç yapısını yeni bileşenlerle genişletmek oldukça kolaydır.
Dezavantajları

  • Bileşen üzerindeki herhangi bir yeni işlem, yaprak düğümde ve bileşik düğümde uygulanmalıdır.
  • İşlemlerin delegasyonu, ek çalışma zamanı maliyetlerine neden olur.
Sıradaki ne?


Cephe modeli ile “Design Patterns: Elements of Reusable Object-Oriented Software” kitabı başka bir yapısal model içermektedir. Cephe modeli, karmaşık bir kitaplık veya çerçeve için basitleştirilmiş bir arabirim sağlar.


(rm)



Haberin Sonu
 
Üst