Введение
Сегодня я немного работал на схеме посредника. Этот шаблон принимается для уменьшения сложности связи между несколькими объектами. Вместо того, чтобы реализовать внутри каждого класса прямое связь с другими классами (сильная связь), реализован объект посредника, и каждый класс может вызвать этот объект посредника для связи с другими. Это может принести свободную связь между классами и облегчить развитие и продление программы. Узор посредника классифицируется как поведенческий узор Отказ
Реальный образ жизни
В настоящее время я начал использовать очень отличное приложение Слишком хорошо Идти в моей повседневной жизни. Это приложение соединяет клиентов к ресторанам и магазинам, которые не простают профицитную пищу. Его цель состоит в том, чтобы уменьшить пищевые отходы и защитить нашу землю. Я могу купить «Пищевые корзины» близлежащих магазинов в этом приложении с очень низкой ценой. Какая отличная идея!
Видите, я зарезервировал корзину для этого вечера:
Это приложение на самом деле очень хорошим примером для Узор посредника Отказ Давайте посмотрим, как клиенты должны делать, чтобы запросить и купить доступные продукты питания в магазинах без использования этого приложения (без посредника):
Теперь, используя это Слишком хорошо Идти Приложение, клиенты теперь могут запросить и купить доступные продукты питания таким образом:
Упражнение в Питоне
Таким образом, я хотел бы моделировать идею Слишком хорошо Идти в моем упражнении. Идти.
Определить Корзина класс:
## Basket of Too good to go class BasketInfo: """Food Basket info""" def __init__(self, location, price, address, Shop): self.__location = location self.__price = price self.__address = address self.__Shop = Shop def getLocation(self): return self.__location def getAddress(self): return self.__address def getShopName(self): return self.__Shop.getName() def showInfo(self, isShowShop = True): print(" ++ Location: {}".format(self.__location) ) print(" ++ Price: {}" .format( str(self.__price) + " euros") ) print(" ++ Address: {}" .format( self.__address) ) print(" ++ Shop: " + self.getShopName() if isShowShop else "") print()
Basketplatformapp класс, который служит посредником:
import difflib ## Check the similarity of two strings def get_equal_rate(str1, str2): return difflib.SequenceMatcher(None, str1, str2).quick_ratio() class BasketPlatformApp: """Too Good To Go platform""" def __init__(self, name): self.__BasketInfos = [] self.__name = name def getName(self): return self.__name def addBasketInfo(self, BasketInfo): self.__BasketInfos.append(BasketInfo) def removeBasketInfo(self, BasketInfo): for info in self.__BasketInfos: if(info == BasketInfo): self.__BasketInfos.remove(info) def getSearchCondition(self, description): return description def getMatchInfos(self, searchCondition): print(self.getName(), " shows suitable baskets for you:") suitables = [] for info in self.__BasketInfos: if get_equal_rate(searchCondition, info.getLocation()) > 0.9: info.showInfo(False) suitables.append(info) return suitables def addBasket(self, BasketInfo): print(self.getName(), " has a new avaible Basket \n -- Provided by ", BasketInfo.getShopName(), ",\n -- Located at: ", BasketInfo.getAddress()) def addBaskets(self): for info in self.__BasketInfos : self.addBasket(info)
Теперь определите баскетбоп и классы клиентов. Они не будут общаться напрямую друг с другом. Их общение осуществляется через посредник. Обратите внимание, что они не реализуют друг друга в своем коде:
class BasketShop: """ BasketShop class """ def __init__(self, name): self.__name = name self.__BasketInfo = None def getName(self): return self.__name def setBasketInfo(self, address, location, price): self.__BasketInfo = BasketInfo(location, price, address, self) def publishBasketInfo(self, App): App.addBasketInfo(self.__BasketInfo) print(self.getName() + " pushes a Basket on ", App.getName(), ": ") self.__BasketInfo.showInfo() class Customer: """User of TooGoodToGO""" def __init__(self, name): self.__name = name def getName(self): return self.__name def findBasket(self, description, App): print("User " + self.getName() + ", searching a backet with info: " + description ) print() return App.getMatchInfos(App.getSearchCondition(description)) def viewBasket(self, BasketInfos): size = len(BasketInfos) return BasketInfos[size-1] def buyBasket(self, BasketInfo, App): """ command Basket on App """ print(self.getName(), " made a new command on ", App.getName(), " for a basket in ", BasketInfo.getShopName())
Теперь запустите симуляцию Посредник шаблон:
if __name__ == "__main__": myAPP = BasketPlatformApp("Too Good To Go") Paul = BasketShop("Paul"); Paul.setBasketInfo("La Defense Parvis 15, 92000, Haut-Seine", "4 temps commercial center", 3.99) Paul.publishBasketInfo(myAPP) Auchan = BasketShop("Auchan") Auchan.setBasketInfo("22 Rue Alma, 92240, Courbevoie", "Supermarcket A2Pas" , 4.0) Auchan.publishBasketInfo(myAPP) Sushi = BasketShop("Sushi Shop") Sushi.setBasketInfo("La Defense Parvis 15, 92000, Haut-Seine", "4 temps commercial center", 6.99) Sushi.publishBasketInfo(myAPP) print() myAPP.addBaskets() print() jemaloQ = Customer("jemaloQ") BasketInfos = jemaloQ.findBasket("4 temps commercial center", myAPP) print() print("Searching available baskets for you ……") print() AppropriateBasket = jemaloQ.viewBasket(BasketInfos) jemaloQ.buyBasket(AppropriateBasket, myAPP)
Выход выполнения;
Пищевые магазины толкает доступные корзины на платформу APP:
Слишком хорошо, чтобы пойти Обновляет свои доступные корзины:
A Слишком хорошо, чтобы пойти Поиск пользователей и купить корзину для продовольствия:
Оригинал: “https://dev.to/jemaloqiu/design-pattern-in-python-6-mediator-pattern-b7d”