// Programa de ejemplo para explicar el patrĂ³n Strategy. #include #include #include #include #include using std::vector; using std::unique_ptr; using std::make_unique; using std::cout; using std::string; class Docente; // Esta clase es abstracta porque tiene un metodo puramente virtual. class Rol { public: virtual float calcular_sueldo(Docente *d) = 0; virtual ~Rol() { } }; class Tutoreo : public Rol { public: virtual float calcular_sueldo(Docente *d) { return 400.000e3; } }; class Profesorado : public Rol { public: int antiguedad; Profesorado(int ant) : antiguedad(ant) { } virtual float calcular_sueldo(Docente *d) { return 400.000e3 * (1 + .04 * antiguedad); } }; class Docente { string nombre; int legajo; unique_ptr rol; public: Docente(const char *nombre_, int legajo_) : nombre(nombre_), legajo(legajo_), rol(new Tutoreo()) { } string& get_nombre() { return nombre; } float sueldo() { return rol->calcular_sueldo(this); } void promocionar(int antiguedad) { rol = make_unique(antiguedad); } void tutorizar() { rol = make_unique(); } }; void mostrar(vector> &docentes) { for (unique_ptr& d : docentes) { cout << d->get_nombre() << " sueldo: " << d->sueldo() << "\n"; } } unique_ptr hacer_profesor(const char *n, int leg, int ant) { auto d = make_unique(n, leg); d->promocionar(ant); return d; } unique_ptr hacer_tutor(const char *n, int leg) { return make_unique(n, leg); } int main() { vector> docentes; docentes.push_back(hacer_profesor("Mina", 53053, 5)); docentes.push_back(hacer_tutor("Juan", 5353)); mostrar(docentes); docentes[1]->promocionar(7); mostrar(docentes); docentes[0]->tutorizar(); mostrar(docentes); return 0; }