Wzorzec projektowy strategia - strategy
Wzorzec projektowy fabryka abstrakcyjna - abstract factory
Wzorzec projektowy budowniczy - builder
Wzorzec projektowy metoda wytwórcza - factory method
Wzorzec projektowy prototyp - prototype
Wzorzec projektowy singleton
Wzorzec projektowy adapter
Wzorzec projektowy dekorator - decorator
Wzorzec projektowy fasada - facade
Wzorzec projektowy kompozyt - composite
Wzorzec projektowy most - bridge
Wzorzec projektowy pełnomocnik - proxy
Wzorzec projektowy pyłek - flyweight
Wzorzec projektowy łańcuch zobowiązań - chain of responsibility
Wzorzec projektowy polecenie - command
Wzorzec projektowy interpreter
Wzorzec projektowy iterator
Wzorzec projektowy mediator
Wzorzec projektowy pamiątka - memento
Wzorzec projektowy metoda szablonowa - template method
Wzorzec projektowy obserwator - observer
Wzorzec projektowy stan - state
Wzorzec projektowy strategia - strategy
Wzorzec projektowy odwiedzający - visitor
Ta strona należy do działu:
Programowanie poddziału
Wzorce projektowe Autor podstrony: Krzysztof Zajączkowski
Stronę tą wyświetlono już: 3584 razy
Opis wzorca projektowego strategia
Wzorzec projektowy strategia należy do wzorców czynnościowych. Jego implementacja umożliwia wybranie klasy dziedziczącej po danym interfejsie, która to odpowiada za sposób realizacji zadania lub zadań tegoż obiektu. Wszystkie klasy dziedziczące realizują to samo zadanie ale w odmienny sposób.
Przykład diagramu UML wzorca projektowego strategia
Na poniższym diagramie UML interfejs iNumeric jest dziedziczony przez klasy Numeric i Alphabetic , które odpowiedzialne są za wypisanie listy numerowanej. Klasa Numeric używa jako numeracji cyfr arabskich natomiast klasa Alphabetic liter alfabetu łacińskiego. Klasa główna NumericList zawiera pole list , które przechowuje dodane dane tekstowe listy numerowanej. Klasa ta agreguje również interfejs iNumeric w polu system . Pole to jest ustawiane wewnątrz metody setSystem .
Przykładowy diagram UML dla wzorca projektowego strategia
Przykładowa implementacja wzorca projektowego strategia
#include <iostream>
#include <vector>
#include <string>
class iNumeric{
public:
virtual void write(const std::vector<std::string> &list) = 0;
};
class Numeric : public iNumeric {
virtual void write(const std::vector<std::string> &list) {
for(int i = 0; i < list.size(); i++){
std::cout << (i + 1) << ") " << list[i] << std::endl;
}
}
};
class Alphabetic : public iNumeric {
virtual void write(const std::vector<std::string> &list) {
for(int i = 0; i < list.size(); i++){
std::cout << char(i + 97) << ") " << list[i] << std::endl;
}
}
};
class NumericList{
public:
enum list_type{
numeric,
alphabetic
};
protected:
std::vector<std::string> list;
iNumeric* system;
public:
NumericList() : system(NULL) {}
void setSystem(list_type listType){
if(system)
delete system;
switch((int)listType){
case list_type::numeric:
system = new Numeric;
break;
case list_type::alphabetic:
system = new Alphabetic;
break;
}
}
void write(){
if(system){
system->write(list);
}
}
NumericList& operator +=(const std::string &text){
list.push_back(text);
return *this;
}
};
int main(){
NumericList numericlist;
numericlist += "Some text line one";
numericlist += "Some text line two";
numericlist.setSystem(NumericList::list_type::numeric);
numericlist.write();
numericlist.setSystem(NumericList::list_type::alphabetic);
numericlist.write();
std::cin.get();
return 0;
}
Wynik działania powyższego kodu:
1) Some text line one
2) Some text line two
a) Some text line one
b) Some text line two
Strony powiązane