1. 程式人生 > >【編程思想】【設計模式】【結構模式Structural】MVC

【編程思想】【設計模式】【結構模式Structural】MVC

style ring gui \n http PE struct class console

Python版

https://github.com/faif/python-patterns/blob/master/structural/mvc.py

技術分享圖片
#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
*TL;DR80
Separates data in GUIs from the ways it is presented, and accepted.
"""

class Model(object):

    def __iter__(self):
        raise NotImplementedError

    def get(self, item):
        
"""Returns an object with a .items() call method that iterates over key,value pairs of its information.""" raise NotImplementedError @property def item_type(self): raise NotImplementedError class ProductModel(Model): class Price(float): """A polymorphic way to pass a float with a particular __str__ functionality.
""" def __str__(self): first_digits_str = str(round(self, 2)) try: dot_location = first_digits_str.index(.) except ValueError: return (first_digits_str + .00) else: return (first_digits_str +
0 * (3 + dot_location - len(first_digits_str))) products = { milk: {price: Price(1.50), quantity: 10}, eggs: {price: Price(0.20), quantity: 100}, cheese: {price: Price(2.00), quantity: 10} } item_type = product def __iter__(self): for item in self.products: yield item def get(self, product): try: return self.products[product] except KeyError as e: raise KeyError((str(e) + " not in the model‘s item list.")) class View(object): def show_item_list(self, item_type, item_list): raise NotImplementedError def show_item_information(self, item_type, item_name, item_info): """Will look for item information by iterating over key,value pairs yielded by item_info.items()""" raise NotImplementedError def item_not_found(self, item_type, item_name): raise NotImplementedError class ConsoleView(View): def show_item_list(self, item_type, item_list): print(item_type.upper() + LIST:) for item in item_list: print(item) print(‘‘) @staticmethod def capitalizer(string): return string[0].upper() + string[1:].lower() def show_item_information(self, item_type, item_name, item_info): print(item_type.upper() + INFORMATION:) printout = Name: %s % item_name for key, value in item_info.items(): printout += (, + self.capitalizer(str(key)) + : + str(value)) printout += \n print(printout) def item_not_found(self, item_type, item_name): print(That %s "%s" does not exist in the records % (item_type, item_name)) class Controller(object): def __init__(self, model, view): self.model = model self.view = view def show_items(self): items = list(self.model) item_type = self.model.item_type self.view.show_item_list(item_type, items) def show_item_information(self, item_name): try: item_info = self.model.get(item_name) except: item_type = self.model.item_type self.view.item_not_found(item_type, item_name) else: item_type = self.model.item_type self.view.show_item_information(item_type, item_name, item_info) if __name__ == __main__: model = ProductModel() view = ConsoleView() controller = Controller(model, view) controller.show_items() controller.show_item_information(cheese) controller.show_item_information(eggs) controller.show_item_information(milk) controller.show_item_information(arepas) ### OUTPUT ### # PRODUCT LIST: # cheese # eggs # milk # # PRODUCT INFORMATION: # Name: Cheese, Price: 2.00, Quantity: 10 # # PRODUCT INFORMATION: # Name: Eggs, Price: 0.20, Quantity: 100 # # PRODUCT INFORMATION: # Name: Milk, Price: 1.50, Quantity: 10 # # That product "arepas" does not exist in the records
Python轉載版

【編程思想】【設計模式】【結構模式Structural】MVC