Привет всем, давайте сегодня вместе изучим новый шаблон проектирования под названиемрежим мультимедиа.
Так называемая среда на самом деле является своего рода идеей инкапсуляции, которая абстрагирует общую логику некоторых функций в промежуточную среду, тем самым уменьшая связь между кодами, улучшая масштабируемость и делая будущие изменения спроса более удобными.
Простой случай
Давайте используем практический пример, чтобы понять шаблон проектирования медиа.
Предположим, мы хотим создать чат.Если мы действительно хотим это сделать, это будет очень сложно, включая много знаний в области сетевого программирования, таких как вещание, клиент, сервер и так далее. Мы упростили это для демонстрационных целей. После такого упрощения до крайности код нашего чата состоит всего из нескольких строк:
class User:
def __init__(self, name):
self.name = name
def say(self, message):
call_something()
print('[{} says:] {}'.format(self.name, message))
Эта логика ничего не говорит, каждый должен быть в состоянии понять. Предположим, мы просто выполняем требования продакт-менеджера, в чем проблема?
Функционал конечно ОК, но есть две большие проблемы в конструкции системы. первыйпроблема логического повторения, мы реализовали функцию того, как общаться в чате в классе User, который является объектом пользователя в чате. Мы обнаружим, что приватные чаты между пользователями, видео и языки между пользователями могут использовать аналогичную логику, такую как установление сетевого соединения, например, отправка сообщения, оценка того, успешно ли отправлено сообщение, и так далее.
Но теперь эта логика жестко запрограммирована в классе User. Если другие классы захотят их использовать, их вообще нельзя использовать повторно, можно только скопировать код. Копирование и копирование таким образом делает код очень запутанным и трудным для сопровождения.
Второй вопросПроблема логической связи, класс User является классом объектов пользователя комнаты чата, но он реализует многие функции комнаты чата. На первый взгляд это выглядит просто, но на самом деле коды двух разных концепций чата и пользователя связаны вместе. У многих мусорных проектов есть эта проблема.Очевидно, что сам A должен быть отдельной сущностью, но мне нужно изменить код в B. Со временем даже сами разработчики забудут, где была размещена логика для реализации ХХ.
Анализ этого случая на самом деле является ответом на вопрос, почему мы должны использовать шаблоны проектирования.В большинстве случаев шаблон проектирования не может напрямую повысить эффективность проекта, его основная функция заключается в расширении кода и его ремонтопригодности.. Если вы не используете разумные шаблоны проектирования, код проекта будет постепенно становиться все более и более раздутым по мере увеличения функциональности, пока людям не станет трудно поддерживать его.
режим мультимедиа
Вернемся к теме: как мы можем использовать шаблоны медиадизайна для решения двух вышеупомянутых проблем?
На самом деле это очень просто, давайте посмотрим на код напрямую:
class ChatRoom:
def display_message(self, user, message):
print('[{} says]: {}'.format(user, message))
class User:
def __init__(self, name):
self.name = name
self.chat_room = ChatRoom()
def say(self, message):
self.chat_room.display_message(self, message)
Другими словами, мы абстрагировали класс ChatRoom, отделили функцию комнаты чата от класса User и использовали ее как переменную-член класса User. Преимущество этого в том, что,Когда функции чата нужно будет повторно использовать или модифицировать в будущем, мы можем не беспокоить класс User.. В противном случае разработчикам нужно точно найти актуальную логику чата в куче кода класса User и модифицировать ее, поверьте, это далеко не лучший опыт.
Конечно, это не было оптимизировано до предела.Поскольку существует много экземпляров класса User, мы обнаружим, что каждый раз, когда мы создаем экземпляр User, будет генерироваться экземпляр ChatRoom, что на самом деле очень избыточно и не нужно. . так что мы можемДизайн ChatRoom как одноэлементный шаблон, независимо от того, сколько экземпляров создает пользователь, полученная комната чата остается неизменной, что позволяет экономить память.
Давайте воспользуемся шаблоном singleton, чтобы переписать код ChatRoom:
import threading
class ChatRoom:
_lock = threading.Lock()
def __init__(self):
pass
def __new__(cls, *algs, **kw):
if not hasattr(ChatRoom, '_instance'):
with ChatRoom._lock:
if not hasattr(ChatRoom, '_instance'):
ChatRoom._instance = object.__new__(cls)
return ChatRoom._instance
На данный момент задача оптимизирована до предела. Кажется, что это простая функция, но на самом деле она включает в себя множество деталей и размышлений. Это отнюдь не так просто, как кажется на первый взгляд. Это содержание часто не изучается в книгах и может быть получено только путем практика и размышление..
Вот и все, что касается сегодняшней статьи, и я искренне желаю вам удачи каждый день. Если вам все еще нравится сегодняшний контент, пожалуйста, зайдите на одинТройная поддержкабар~(Нравится, подписывайтесь, делайте репост)
Исходная ссылка, нажмите, чтобы перейти, получить больше статей