• 【编程思想】【设计模式】【结构模式Structural】MVC


    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 += '
    '
            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转载版
  • 相关阅读:
    02_5if switch分支与循环语句
    02_4运算符
    02_3程序格式
    Shell脚本调用ftp上传文件
    02_2数据类型转换
    02_1标识符_关键字_数据类型
    01_3Java Application初步
    01_2Java开发环境的下载 安装 配置
    Mac 安装MySQL
    用 Homebrew 带飞你的 Mac
  • 原文地址:https://www.cnblogs.com/demonzk/p/9035459.html
Copyright © 2020-2023  润新知