【编程思想】【设计模式】【结构模式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 += ‘\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转载版

原文地址:https://www.cnblogs.com/demonzk/p/9035459.html

时间: 2024-10-01 03:06:44

【编程思想】【设计模式】【结构模式Structural】MVC的相关文章

【编程思想】【设计模式】【结构模式Structural】享元模式flyweight

Python版 https://github.com/faif/python-patterns/blob/master/structural/flyweight.py #!/usr/bin/env python # -*- coding: utf-8 -*- """ *References: http://codesnipers.com/?q=python-flyweights *TL;DR80 Minimizes memory usage by sharing data w

【编程思想】【设计模式】【结构模式Structural】门面模式/外观模式Facade

Python版 https://github.com/faif/python-patterns/blob/master/structural/facade.py #!/usr/bin/env python # -*- coding: utf-8 -*- """ *What is this pattern about? The Facade pattern is a way to provide a simpler unified interface to a more com

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

Python版 https://github.com/faif/python-patterns/blob/master/structural/front_controller.py #!/usr/bin/env python # -*- coding: utf-8 -*- """ @author: Gordeev Andrey <[email protected]> *TL;DR80 Provides a centralized entry point that

【编程思想】【设计模式】【结构模式Structural】代理模式Proxy

Python版 https://github.com/faif/python-patterns/blob/master/structural/proxy.py #!/usr/bin/env python # -*- coding: utf-8 -*- """ *TL;DR80 Provides an interface to resource that is expensive to duplicate. """ from __future__

面向对象编程思想-中介者模式

一.引言 前两天休息日在网上打QQ斗地主,每盘结束后腾讯游戏平台会自动计算输赢的欢乐豆,嗯?挺好的,平时在面对面玩斗地主时,一盘游戏结束后,我们需要了解每个人的出牌状况,然后算出来输赢.现在有了游戏平台,玩家之间计算输赢这个操作交给了游戏平台,我们不再需要了解每个人的出牌状况.在软件设计中,我们将解决这种业务场景的模式称之为中介者模式 二.中介者模式 定义:用一个中介对象来封装一系列对象的交互.中介者使各对象不需要显式的相互引用,从而使其耦合松散,而且独立改变它们之间的交互. 下面是中介者模式结

面向对象编程思想-简单工厂模式

一.引言 简单工厂.工厂方法.抽象工厂模式都属于设计模式中的创建型设计模式,它们帮助我们把对象的实例化部分抽取出来,进而优化系统架构,提高系统的扩展性.本文介绍一个比较容易理解的模式-简单工厂模式. 二.简单工厂模式 定义:"工厂"?!看到这个词语,在现实生活中大家会想到是生产产品的,同样,在简单工厂模式里大家可以理解为工厂其实就是创建对象的一个类.平时我们编程的时候,当使用"new"创建对象时,此类就增加了对该对象的依赖,它们之间的耦合度就增加了,这样当业务需求变

七、适配器(Adapter)模式--结构模式(Structural Pattern)

适配器模式:把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法在一起工作的两个类能够在一起工作. 类的 Adapter模式的结构: 类适配器类图: 由图中可以看出,Adaptee 类没有 Request方法,而客户期待这个方法.为了使客户能够使用 Adaptee 类,提供一个中间环节,即类Adapter类, Adapter 类实现了 Target 接口,并继承 自 Adaptee,Adapter 类的 Request 方法重新封装了Adaptee 的SpecificRequ

九、 合成(Composite)模式 --结构模式(Structural Pattern)

合成模式:有时又叫做部分-整体模式(Part-Whole).合成模式将对象组织到树结构中,可以用来描述整体与部分的关系.合成模式可以使客户端将单纯元素与复合元素同等看待. 合成模式分为安全式和透明式 安全式合成模式类图: 抽象构件(Component)角色:这是一个抽象角色,它给参加组合的对象定义出公共的接口及其默认行为,可以用来管理所有的子对象.在安全式的合成模式里,构件角色并不是定义出管理子对象的方法,这一定义由树枝构件对象给出. 树叶构件(Leaf)角色:树叶对象是没有下级子对象的对 象,

设计模式--结构模式--门面模式

一.基本概念 1.外观模式(Facade),也被称为"门面模式".定义了一个高层.统一的接口,外部通过这个统一的接口对子系统中的一群接口进行访问. 2.角色 A:外观(Facade)角色:为多个子系统对外提供一个共同的接口. B:子系统(Sub System)角色:实现系统的部分功能,客户可以通过外观角色访问它. C:客户(Client)角色:通过一个外观角色访问各个子系统的功能. 二.例子. 分诊台作为患者和医生的装饰. A:外观(Facade)角色: 1 package comm.