Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
171 / 92 / 71
Регистрация: 10.05.2014
Сообщений: 432

Design Pattern - Strategy

06.01.2018, 21:17. Показов 2342. Ответов 5

Студворк — интернет-сервис помощи студентам
Всем привет! Хочется услышать мнение со стороны о получившемся коде. Все работает, и вроде как надо, но, не знаю, 6-е чувство подсказывает, что где-то я накосячил... Делал на основе C# кода из википедии. Если кто найдет какую-либо ошибку или недочет, дайте знать! Заранее благодарю!

Python
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
46
47
48
49
50
51
52
53
54
55
from abc import ABCMeta, abstractmethod
 
 
class IStrategy:
    """ Класс реализующий конкретную стратегию, должен наследовать этот абстрактный класс
        Класс контекста использует этот абстрактный класс для вызова конкретной стратегии """
    __metaclass__ = ABCMeta
 
    @abstractmethod
    def algorithm(self):
        pass
 
 
class ConcreteStrategy1(IStrategy):
    """ Первая конкретная реализация-стратегия. """
 
    def algorithm(self):
        print("Выполняется алгоритм стратегии 1")
 
 
class ConcreteStrategy2(IStrategy):
    """ Вторая конкретная реализация-стратегия.
        (P.S. Реализаций может быть сколько угодно много.) """
 
    def algorithm(self):
        print("Выполняется алгоритм стратегии 2")
 
 
class Context:
    """ Контекст, использующий стратегию для решения своей задачи.
 
        Конструктор контекста.
        Инициализирует объект стратегией."""
    def __init__(self, strategy):
        self.strategy = strategy
 
    """ Метод для установки стратегии.
        Служит для смены стратегии во время выполнения. """
 
    def set_strategy(self, strategy):
        self.strategy = strategy
 
    """ Некоторая функциональность контекста, которая выбирает
        стратегию и использует её для решения своей задачи. """
 
    def execute_operation(self):
        self.strategy.algorithm(self)
 
 
if __name__ == '__main__':
    context = Context(ConcreteStrategy1)
    context.execute_operation()
 
    context = Context(ConcreteStrategy2)
    context.execute_operation()
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.01.2018, 21:17
Ответы с готовыми решениями:

strategy pattern
Как можно понять етот пример? а т.е. ведь метод DoAlgorithm(); не может быть вызван в этом месте: theStrategy.DoAlgorithm() ; И зачем нам...

Примеры MVC Design Pattern
где можно почитать о сабже? желательно с примерами

Реализация Bus (publish/subscribe design pattern) - нужен простой пример
public void Publish<TEvent>(TEvent event); public void Subscribe<TEvent>(Action<TEvent> action); Подскажите плз..как это вообще?))...

5
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
07.01.2018, 09:19
Цитата Сообщение от Zodt Посмотреть сообщение
Все работает
Где же оно работает?
https://ideone.com/wLr1FD
Code
1
2
3
4
Traceback (most recent call last):
  File "prog.py", line 52, in <module>
  File "prog.py", line 47, in execute_operation
TypeError: unbound method algorithm() must be called with ConcreteStrategy1 instance as first argument (got Context instance instead)
Метод __init__ класса Context ожидает экземпляр, а не класс. И self передавать явно не нужно:
Python
1
2
3
4
5
6
7
8
9
10
11
…
    def execute_operation(self):
        self.strategy.algorithm()
 
 
if __name__ == '__main__':
    context = Context(ConcreteStrategy1())
    context.execute_operation()
 
    context = Context(ConcreteStrategy2())
    context.execute_operation()
Похоже, автор использует Python 3. Я же решил, что это Python 2 из-за того, как указан метакласс для IStrategy.

В третьей версии такой код выполнится успешно:
Python
1
2
if __name__ == '__main__':
    s = IStrategy()
Это не то, что ожидается. Ожидаемое поведение — попытка создания экземпляра абстрактного класса должна приводить к ошибке. Переписываем:
Python
1
2
3
4
class IStrategy(metaclass=ABCMeta):
    @abstractmethod
    def algorithm(self):
        pass
Результат выполнения:
Code
1
TypeError: Can't instantiate abstract class IStrategy with abstract methods algorithm
0
171 / 92 / 71
Регистрация: 10.05.2014
Сообщений: 432
07.01.2018, 12:26  [ТС]
Не понимаю что у Вас произошло. Специально на этот сайт залезал (https://ideone.com/RhnYiK) все работает. Единственное, то что Context получает класс, а не экземпляр - согласен, правда, теперь встает вопрос как в конструкторе работать с этим классом?
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
07.01.2018, 12:31
Цитата Сообщение от Zodt Посмотреть сообщение
Не понимаю что у Вас произошло.
Я же написал: выбрал в качестве интерпретатора Python 2. Потому что решил, что код для второй версии. Потому что метакласс указан как будто бы для второго питона. См. пример из документации: abc. Какие последствия — тоже написал.

Строки в аннотациях — штука бесполезная.
И все-таки: передача класса, а не объекта, в контекст — осознанное решение?
0
171 / 92 / 71
Регистрация: 10.05.2014
Сообщений: 432
07.01.2018, 13:16  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
Строки в аннотациях — штука бесполезная.
И все-таки: передача класса, а не объекта, в контекст — осознанное решение?
На самом деле нет. Но, т.к. сперва решил, что все работает, заморачиваться не стал. А вот сейчас думаю как исправить...
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
07.01.2018, 13:28
Цитата Сообщение от Zodt Посмотреть сообщение
А вот сейчас думаю как исправить...
Я во втором сообщении привел исправленные фрагменты кода.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.01.2018, 13:28
Помогаю со студенческими работами здесь

Delta Design - наш ответ Altium Design
Собственно сайт разработчиков: _http://www.delta-ecad.ru ( не сочтите рекламой). Импортозамещение активно шагает по стране. Год назад...

Windows.Forms.Design or ComponentModel.Design
Интересуюсь разработкой дизайнера форм на С#, есть ли у когонибуть доки или примеры по двум замечательным классам(Windows.Forms.Design or...

You Cannot View The Design Of This Database Because Its Design Is Hidd
При открытии базы дизайнером выдает следующее сообщение... как это победить?!? --------------------------- Full Access Administration -...

Source Strategy
Название - Source Strategy Платформа - Android (пока что) Жанр - Стратегия Разработчик - к сожалению только автор Движок - UNITY ...

Паттерн Strategy
Реализовать паттерн Стратегия по примерам из теоретического материала. Сслыка на метериал:...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
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 - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru