Python设计模式

第一章: 设计模式基础

第二章: 常用设计模式

首页 > Python设计模式 > 第二章: 常用设计模式 > 2.9节: MVC模式

2.9节: MVC模式

薯条老师 2021-10-08 13:56:16 210729 0

编辑 收藏

广州番禺Python, Java小班周末班培训

薯条老师在广州做Python和Java的小班培训,一个班最多10人,学员的平均就业薪资有11K。不在广州的同学可以报名线上直播班,跟线下小班的同学们同步学习。培训的课程有Python爬虫,Python后端开发,Python办公自动化,Python大数据分析,Python量化投资,Python机器学习,Java中高级后端开发。授课详情请点击:http://chipscoco.com/?cate=6

2.9.1 MVC模式

MVC是一种框架设计模式,Tornado框架 ,Django框架(MTV模式)等就是基于MVC的思想来实现的。

M即Model, 指业务模型, 对数据的存储和操作进行了抽象
V即View, 指界面视图,用来处理数据的显示
C即Controller, 指控制器,负责处理具体的业务逻辑,接受用户的输入并调用模型和视图来处理用户的需求

2.9.2 理解MVC

MVC模式将软件解耦为模型,视图,控制器三大模块,每个模块各司其职,这样方便维护和重用,也便于团队成员进行合作:前端工程师专注于界面的显示和交互,后端工程师专注于处理业务逻辑。

2.9.3 源码实现

# __author__ = 薯条老师,微信公众号:薯条编程
"""
MVC模式将软件解耦为模型,视图,控制器三大模块,每个模块各司其职,这样方便维护和重用
"""
from urllib.parse import urlparse
import abc

"""
(1) 定义抽象基类Model,表示MVC中的Model:模型对数据的存储和操作进行了抽象
"""
class Model(abc.ABC):
    @classmethod
    def get(cls, **kwargs):
        pass
        
        
"""
(2) GoodsModel是一个具体的模型子类,封装了商品数据的存储和获取操作
"""
class GoodsModel(Model):
    GOODS = {
            1: {"name": "洗发水", "price": 22},
            2: {"name": "牙膏", "price": 15},
            3: {"name": "宠物绳", "price": 29},
            4: {"name": "面包", "price": 16},
            5: {"name": "啤酒", "price": 8},
            6: {"name": "咖啡", "price": 30},
        }
    @classmethod
    def get(cls, **kwargs):
        if "pk" in kwargs:
            return GoodsModel(kwargs["pk"])
            
            
    def __init__(self, pk):
        self.__data = [] if pk not in self.GOODS else [self.GOODS[pk]]
        
        
    @property
    def data(self):
        return self.__data
        
        
"""
(3) 定义抽象基类View,表示MVC中的View,提供了数据显示的抽象接口
"""
class View(abc.ABC):
    @staticmethod
    def show(data):
        """ """
        
        
"""
(4) GoodsView是View的具体子类,负责将商品数据以表格的形式来展示 
"""
class GoodsView(View):
    @staticmethod
    def show(goods):
        """
        :param goods: e.g:{"name": "洗发水", "price": 22}
        :return:
        """
        tr = "+" + "-" * 5 + "+" + "-" * 16 + "+" + "-" * 10 + "+"
        heading = "|{:^8s}|{:^18s}|{:^9s}|".format("id", "商品名", "售价")
        print(tr + "\n" + heading + "\n" + tr)
        for id_, data in enumerate(goods):
            print("|{0:^8s}|{1:{3}^8s}|{2:^10s}|".format(str(id_+1), data["name"],
                                                             str(data["price"]), chr(12288)))
        print(tr)
        
        
"""
(5) 定义抽象基类RequestHandler,表示MVC中的控制器,
负责处理具体的业务逻辑,接受用户的输入并调用模型和视图来处理用户的需求 
"""
class RequestHandler(abc.ABC):
    @abc.abstractmethod
    def get(self, **kwargs):
        pass
        
        
"""
(6)   GoodsDisplayHandler用来处理商品数据显示的具体业务逻辑 
"""
class GoodsDisplayHandler(RequestHandler):
    def get(self, **kwargs):
        if "goods_id" in kwargs:
            goods_model = GoodsModel.get(pk=int(kwargs["goods_id"]))
            GoodsView.show(goods_model.data)
            
            
    def __call__(self, **kwargs):
        method = None if "method" not in kwargs else kwargs["method"]
        if method == "GET":
            self.get(**kwargs)
            
            
if __name__ == "__main__":
    urlpatterns = {"/goods/":  GoodsDisplayHandler}
    url = "http://chipscoco.com/goods/?goods_id=1"
    parse_result = urlparse(url)
    short_url = parse_result.path
    params = {}
    
    for item in parse_result.query.split("&"):
        param = item.split("=")
        params[param[0]] = param[1]
        
    if short_url in urlpatterns:
        handler = urlpatterns[short_url]
        params["method"] = "GET"
        handler()(**params)

2.9.4 最具实力的小班培训

薯条老师在广州做Python和Java的小班培训,一个班最多10人。不在广州的同学可以报名线上直播班,跟线下小班的同学们同步学习。打算参加小班培训的同学,必须遵守薯条老师的学习安排,认真做作业和项目。把知识学好,学扎实,那么找到一份高薪的工作就是很简单的一件事。

(1) Python后端工程师高薪就业班,月薪11K-18K,免费领取课程大纲
(2) Python爬虫工程师高薪就业班,年薪十五万,包拿Offer
(3) 数据分析高薪就业班,月薪11K-15K, 免费领取课程大纲
(4)
Python大数据挖掘,量化投资就业班,月薪12K-25K,免费领取课程大纲

扫码免费领取Python学习资料:


欢迎 发表评论: