Python Design Patterns

三层架构

描述

三层架构(3-tier architecture) 通常意义上的三层架构就是将整个业务应用划分为:表现层(User interface)、业务逻辑层(Business Logic)、数据访问层(Database)。区分层次的目的即为了“高内聚低耦合”的思想。

  1. 表现层(User interface):通俗讲就是展现给用户的界面,即用户在使用一个系统的时候他的所见所得。
  2. 业务逻辑层(Business Logic):针对具体问题的操作,也可以说是对数据层的操作,对数据业务逻辑处理。
  3. 数据访问层(Database):该层所做事务直接操作数据库,针对数据的增添、删除、修改、查找等

实现

#!/usr/bin/env python

class Data():
    """
    数据存储类
    """
    products = {
        'milk': {'price': 1.50, 'quantity': 10},
        'eggs': {'price': 0.20, 'quantity': 100},
        'cheese': {'price': 2.00, 'quantity': 10}
    }

    def __get__(self, obj, cls):
        print("(Fetching From Data Store)")
        return {"products": self.products}


class BusinessLogic():
    """
    业务逻辑存储数据层实例
    """
    data = Data()

    def product_list(self):
        return self.data['products'].keys()

    def product_information(self, product):
        return self.data['products'].get(product, None)


class Ui():
    """
    UI 交互类
    """

    def __init__(self):
        self.business_logic = BusinessLogic()


    def get_product_list(self):
        print("Product List:")
        for product in self.business_logic.product_list():
            yield product

        print('')


    def get_production_information(self, product):
        product_info = self.business_logic.product_information(product)
        if product_info:
            print("Product Information:")
            print("Name: {0}, Price: {1:.2f}, Quantity: {2}".format(
                product.title(), product_info.get('price', 0),
                product_info.get('quantity', 0)
            ))
        else:
            print("That product [{0}] does not exist in records.".format(product))


def main():
    ui = Ui()
    ui.get_product_list()
    ui.get_production_information('cheese')
    ui.get_production_information('eggs')
    ui.get_production_information('milk')
    ui.get_production_information('arepas')

if __name__ == "__main__":
    main()

输出

(Fetching From Data Store)
Product Information:
Name: Cheese, Price: 2.00, Quantity: 10
(Fetching From Data Store)
Product Information:
Name: Eggs, Price: 0.20, Quantity: 100
(Fetching From Data Store)
Product Information:
Name: Milk, Price: 1.50, Quantity: 10
(Fetching From Data Store)
That product [arepas] does not exist in records.

结论

优点

  1. 开发人员可以只关注整个结构中的其中某一层;
  2. 可以很容易的用新的实现来替换原有层次的实现;
  3. 可以降低层与层之间的依赖;
  4. 有利于标准化;
  5. 利于各层逻辑的复用。
  6. 结构更加的明确
  7. 在后期维护的时候,极大地降低了维护成本和维护时间

缺点

  1. 降低了系统的性能。这是不言而喻的。如果不采用分层式结构,很多业务可以直接造访数据库,以此获取相应的数据,如今却必须通过中间层来完成。
  2. 有时会导致级联的修改。这种修改尤其体现在自上而下的方向。如果在表示层中需要增加一个功能,为保证其设计符合分层式结构,可能需要在相应的业务逻辑层和数据访问层中都增加相应的代码。
  3. 增加了开发成本。