Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/26: Рейтинг темы: голосов - 26, средняя оценка - 5.00
36 / 36 / 2
Регистрация: 28.04.2013
Сообщений: 110

Паттерн стратегия

07.02.2014, 22:43. Показов 5228. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!

Начал изучать паттерны. Одним из наиболее понятных и интересных мне оказался паттерн Стратегия. Я начитался статей и примеров из различных источников. И как говорится запилил собственный пример на С++ и Java, с преферансом и куртизанками. =) Дабы устаканить у себя в голове полученные знания, я выставляю свой пример на обозрение опытных проггеров, чтобы вы посмотрели и указали на ошибки если таковые имеются.

main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <cstdlib>
 
#include "header/strategy.h"
#include "header/concrete_output1.h"
#include "header/concrete_output2.h"
#include "header/printer.h"
 
using namespace std;
 
int main()
{
    Printer some_printer;
    ConcreteOutput1 out1;
    ConcreteOutput2 out2;
 
    some_printer.set_output_method(&out1);
    some_printer.print();
 
    some_printer.set_output_method(&out2);
    some_printer.print();
 
    system("pause");
    return 0;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// strategy.h
 
#ifndef _STRATEGY_H_
#define _STRATEGY_H_
 
class StrategyPrint
{
public:
    StrategyPrint();
    ~StrategyPrint();
 
    virtual void output() = 0;
};
 
#endif
 
// strategy.cpp
 
#include "header/strategy.h"
 
StrategyPrint::StrategyPrint()
{
 
};
 
StrategyPrint::~StrategyPrint()
{
 
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// concrete_output1.h
 
#ifndef _CONCRETE_OUTPUT1_H_
#define _CONCRETE_OUTPUT1_H_
 
#include <iostream>
#include "header/strategy.h"
 
class ConcreteOutput1 : public StrategyPrint
{
public:
    ConcreteOutput1();
    ~ConcreteOutput1();
 
    void output();
};
 
#endif
 
// concrete_output1.cpp
 
#include "header/concrete_output1.h"
 
ConcreteOutput1::ConcreteOutput1()
{
 
}
 
ConcreteOutput1::~ConcreteOutput1()
{
 
}
 
void ConcreteOutput1::output()
{
    std::cout << "You choose 1st strategy\n";
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// concrete_output2.h
 
#ifndef _CONCRETE_OUTPUT2_H_
#define _CONCRETE_OUTPUT2_H_
 
#include <iostream>
#include "header/strategy.h"
 
class ConcreteOutput2 : public StrategyPrint
{
public:
    ConcreteOutput2();
    ~ConcreteOutput2();
 
    void output();
};
 
#endif
 
// concrete_output2.cpp
#include "header/concrete_output2.h"
 
ConcreteOutput2::ConcreteOutput2()
{
 
}
 
ConcreteOutput2::~ConcreteOutput2()
{
 
}
 
void ConcreteOutput2::output()
{
    std::cout << "You choose 2nd strategy\n";
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
// printer.h
 
#ifndef _PRINTER_H_
#define _PRINTER_H_
 
#include <cstdlib>
#include "header/strategy.h"
 
class Printer
{
public:
    Printer();
    ~Printer();
 
protected:
    StrategyPrint* behavior;
public:
    void set_output_method(StrategyPrint* strat);
    void print();
};
 
#endif
 
// printer.cpp
#include "header/printer.h"
 
Printer::Printer()
{
    behavior = NULL;
}
 
Printer::~Printer()
{
    delete behavior;
}
 
void Printer::set_output_method(StrategyPrint* strat)
{
    behavior = strat;
}
 
void Printer::print()
{
    behavior->output();
}
Надеюсь на вашу конструктивную критику!

ЗЫ. На почти безызвестном ресурсе педивикия, в примере на c++ существуют 2 класса Context и Client, я позволил себе небольшое отступление и реализовал сразу Client в виде Printer. Это же не сильно критично?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.02.2014, 22:43
Ответы с готовыми решениями:

ООП и паттерн Стратегия
Добрый день! Помогите, пожалуйста, изучаю объектно-ориентированное программирование и паттерн Стратегия. В задаче есть два типа объектов. У...

Паттерн Стратегия на примере сортировки
Всем привет! Видел множество примеров по паттерну Стратегия, но не встречал пример со сортировкой, может у кого-нибудь есть реализованный...

Паттерн стратегия и ошибки при компиляции
Здравствуйте уважаемые форумчане. Вот решил я как-то недавно, что мой код говно и надо что-то с этим делать, так как я пишу нормальные по...

9
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
07.02.2014, 22:47
пример как пример. синтетический. прикапываться нет смысла, т.к. это не какое-то боевое решение.
придраться можно к другому:
вы стратегию по указатели передаете и нигде не проверяете на то, что указатель может быть
нулем. в таком случае желательно стратегии принимать по ссылке. чтобы у вызывающей стороны
не было вопросов относительно того, а работает ли принтер с нулевыми указателями.
ну или же обрабатывать как-то ситуацию, когда передали нуль указатель на стратегию.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
07.02.2014, 23:09
Мм почем не сразу

C++
1
some_printer.print(&out1);
Пример неправильного использования, при таком интерфейсе как у тебя.
C++
1
2
3
4
Printer some_printer;
ConcreteOutput1 out1;
 
some_printer.print(); // упс !!! забыли установить стартегию!!
Опять же проверка указателя, и если надо нужно предусмотреть стратегию по умолчанию.
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,536
Записей в блоге: 1
07.02.2014, 23:53
А зачем все советуют проверять указатель на NULL, если он не устанавливается в нуль по умолчанию? С таким же успехом можно проверять указатель на четыре миллиарда других невалидных значений указателя!

Добавлено через 4 минуты
Я вижу другие проблемы! Деструктор StrategyPrint не виртуальный. Почему?
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
07.02.2014, 23:57
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
А зачем все советуют проверять указатель на NULL, если он не устанавливается в нуль по умолчанию?
C++
1
2
3
4
Printer::Printer()
{
    behavior = NULL;
}
Кстати сразу не заметил фигню в деструкторе:

C++
1
2
3
4
Printer::~Printer()
{
    delete behavior;  /*  ??? */
}
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,536
Записей в блоге: 1
08.02.2014, 00:04
Далее главное! Деструктор принтера зачем-то освобождает память из-под указателя на стратегию! Это ахтунг! Динамическая память тут вообще не выделяется нигде! И даж если б выделялась это не забота принтера её удалять! Он даже не знает как именно она выделена!

Добавлено через 2 минуты
Avazart, и чё? К нулю то как раз можно делитЪ применить, а о том, что в деструкторе косяк, я написал до тебя выше!
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
08.02.2014, 08:41
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
К нулю то как раз можно делитЪ применить
C++
1
2
3
4
void Printer::print()
{
    behavior->output();//Тут с нулем тоже прокатит?
}
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,536
Записей в блоге: 1
08.02.2014, 10:32
Croessmah, a тут разве делитъ? Ты посмотри на его деструктор!
0
36 / 36 / 2
Регистрация: 28.04.2013
Сообщений: 110
08.02.2014, 10:51  [ТС]
По поводу delete в деструкторе, это меня всё java попутала со своими some_func(new SomeObject())
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.02.2014, 12:56
Цитата Сообщение от el_gato_de_Ch Посмотреть сообщение
По поводу delete в деструкторе, это меня всё java попутала со своими some_func(new SomeObject())
Никто не мешает делать как в яве, только в таком случае лучше уже сразу предавать умный указатель.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.02.2014, 12:56
Помогаю со студенческими работами здесь

Сделать выбор персонажа игры, вывод его скилов и предметов, используя паттерн стратегия
В лабе надо было сделать выбор персонажа игры,вывод его скилов и предметов,используя паттерн стратегия.В VS программа вроде...

С++ Паттерн "стратегия". Проблема
Добрый день. Начал изучать паттерны проектирования, столкнулся с шаблоном &quot;Стратегия&quot;. Решение конкретно моей проблемы в интернете не...

Стратегия выборки
Используя один из языков высокого уровня составить модель стратегии операционной системы для управления виртуальной памятью. Условия...

Пошаговая стратегия(начало)
ребят тут такое дело. мне нужно написать пошаговую стратегию на языке с++. для начала нужно создать 1)Класс игровое поле (назовем его...

Стратегия выделения/освобождения памяти
здравствуйте господа. есть такой вопрос. пусть есть класс например Bitmap - несжатое растровое изображение. Пусть необходимо уметь...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru