structural pattern (tsz. structural patterns)
👉 Ezek a minták segítenek a kód újrastrukturálásában anélkül, hogy jelentősen megváltoztatnánk az eredeti kódot.
Minta | Fő cél |
---|---|
Adapter | Két inkompatibilis interfész illesztése |
Bridge | Absztrakció és implementáció szétválasztása |
Composite | Hierarchikus szerkezet (pl. fák) kezelése egységes módon |
Decorator | Dinamikusan új funkciók hozzáadása öröklés nélkül |
Facade | Egyszerűsített interfész biztosítása komplex rendszerhez |
Flyweight | Tömeges objektumkezelés memóriahatékonyan, osztott állapot |
Proxy | Hozzáférés vezérlése másik objektumhoz (helyettesítő) |
Összeköt két inkompatibilis interfészt – például ha egy régi rendszer más nevet/paramétert használ.
class Target {
public:
virtual void request() = 0;
};
class Adaptee {
public:
void specificRequest() {
std::cout << "Régi interfész\n";
}
};
class Adapter : public Target {
Adaptee* adaptee;
public:
Adapter(Adaptee* a) : adaptee(a) {}
void request() override {
adaptee->specificRequest();
}
};
Szétválasztja az absztrakciót (amit használunk) az implementációtól (ahogy működik), így külön is bővíthetők.
class Renderer {
public:
virtual void renderCircle(float r) = 0;
};
class OpenGLRenderer : public Renderer {
public:
void renderCircle(float r) override {
std::cout << "Rajzolás OpenGL-lel, r=" << r << "\n";
}
};
class Shape {
protected:
Renderer* renderer;
public:
Shape(Renderer* r) : renderer(r) {}
virtual void draw() = 0;
};
class Circle : public Shape {
float radius;
public:
Circle(Renderer* r, float rad) : Shape(r), radius(rad) {}
void draw() override {
renderer->renderCircle(radius);
}
};
Fa-struktúrában (pl. menük, fájlok) az egyedeket és az összetetteket egyformán kezeljük.
class Component {
public:
virtual void show() = 0;
};
class Leaf : public Component {
public:
void show() override {
std::cout << "Levél elem\n";
}
};
class Composite : public Component {
std::vector<Component*> children;
public:
void add(Component* c) { children.push_back(c); }
void show() override {
for (auto c : children) c->show();
}
};
Dinamikusan ad viselkedést egy objektumhoz, öröklés nélkül. Ahelyett, hogy alosztályt csinálnánk, becsomagoljuk.
class Coffee {
public:
virtual int cost() const = 0;
};
class BasicCoffee : public Coffee {
public:
int cost() const override { return 100; }
};
class MilkDecorator : public Coffee {
Coffee* base;
public:
MilkDecorator(Coffee* b) : base(b) {}
int cost() const override { return base->cost() + 30; }
};
Egyszerű interfészt biztosít egy összetett rendszerhez, elrejti a részleteket.
class CPU {
public: void start() { std::cout << "CPU indul\n"; } };
class Disk {
public: void read() { std::cout << "Lemez olvasás\n"; } };
class Memory {
public: void load() { std::cout << "Memória töltés\n"; } };
class Computer {
CPU cpu;
Disk disk;
Memory mem;
public:
void start() {
cpu.start();
mem.load();
disk.read();
}
};
Sok kis objektum közös (osztott) belső állapotot használ – pl. karakterek megjelenítése szövegszerkesztőben.
Kontrollálja az elérést egy másik objektumhoz (pl. távoli hívás, lazy init, hitelesítés)
class RealImage {
public:
void display() { std::cout << "Kép megjelenítése\n"; }
};
class ImageProxy {
RealImage* image;
public:
ImageProxy() : image(nullptr) {}
void display() {
if (!image) image = new RealImage();
image->display();
}
};
Minta | Használat célja |
---|---|
Adapter | Régi és új kód összekapcsolása |
Bridge | Külön absztrakció és implementáció |
Composite | Hierarchikus elemek egységes kezelése |
Decorator | Új viselkedés dinamikus hozzáadása |
Facade | Komplex rendszer egyszerűsítése |
Flyweight | Sok hasonló objektum, közös adat |
Proxy | Hozzáférés-ellenőrzés, késleltetés, védelem |