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

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

07.02.2014, 22:43. Показов 5162. Ответов 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
8484 / 6151 / 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,531
Записей в блоге: 1
07.02.2014, 23:53
А зачем все советуют проверять указатель на NULL, если он не устанавливается в нуль по умолчанию? С таким же успехом можно проверять указатель на четыре миллиарда других невалидных значений указателя!

Добавлено через 4 минуты
Я вижу другие проблемы! Деструктор StrategyPrint не виртуальный. Почему?
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 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,531
Записей в блоге: 1
08.02.2014, 00:04
Далее главное! Деструктор принтера зачем-то освобождает память из-под указателя на стратегию! Это ахтунг! Динамическая память тут вообще не выделяется нигде! И даж если б выделялась это не забота принтера её удалять! Он даже не знает как именно она выделена!

Добавлено через 2 минуты
Avazart, и чё? К нулю то как раз можно делитЪ применить, а о том, что в деструкторе косяк, я написал до тебя выше!
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 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,531
Записей в блоге: 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
8484 / 6151 / 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
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru