MVC模式介紹

MVC模式

概念

  • 模型-視圖-控制器模式
    • 模型:聲明存儲和操作數據的類
    • 視圖:聲明構建用戶界面和顯示數據的類
    • 控制器:連接模型和視圖的類
    • 客戶端:根據某些操作來獲得某些結果

各層的定義

  • 模型層定義針對數據的所有操作,並且提供與數據使用方式有關的方法。比如數據庫連接等。
  • 視圖層代表用戶界面,比如GUI,web的前端等,他沒有邏輯處理,只用來顯示數據。
  • 控制層用來請求接收視圖層的數據,然後發送到系統其它部分。一般在這配置路由系統。

應用場景

  • 更改展示方式而不更改業務邏輯
  • 多個控制器用於多個視圖來更改用戶界面的顯示數據
  • 模型改變,視圖不用改變,他們相互獨立

主要目的

  • 數據和數據的展示隔離
  • 維護和實現更加簡單
  • 靈活的改變數據的存儲和顯示方式,讓他們獨立。

例子:

# 模型-視圖-控制器模式
class Model:
    services = {
        'email':
            {
                'number': 1000,
                'price': 2,
            },
        'sms':
            {
                'number': 1000,
                'price': 10,
            },
        'voice':
            {
                'number': 1000,
                'price': 15,
            }
    }


class View:
    def list_services(self, services):
        for svc in services:
            print(svc, ' ')

    def list_pricing(self, services):
        for svc in services:
            print(Model.services[svc]['number'],
                  '條',
                  svc,
                  '消息你應該支付',
                  Model.services[svc]['price'],
                  '元')


class Controller:
    def __init__(self):
        self.model = Model()
        self.view = View()

    def get_services(self):
        services = self.model.services.keys()
        return self.view.list_services(services)

    def get_pricing(self):
        services = self.model.services.keys()
        return self.view.list_pricing(services)


def Client():
    controller = Controller()
    print('我們提供:')
    controller.get_services()
    print('他們的價格是:')
    controller.get_pricing()


Client()

還有很經典的web框架都是mvc或者mtv模式
比如Django也是以模型-視圖-控制器來構造項目的,只是形式爲模型-模板-視圖(Model-Template-View,MTV),其中M是數據庫,T是視圖,V是視圖和路由。Tornado是一個標準的MVC框架,可以再去查看。

MVC模式的優點

  • 可以把3層分開,調高可維護性,降低複雜度
  • MVC允許對前端進行獨立更改,而後端不需要改動或者很少改動。
  • 同樣可以更改後端而不改前端
  • 更改控制器也不會對其他造成影響
  • MVC可以把職位分開(前端,後端,UI),可以在擅長的領域工作。

一些問題

  • MVC是不是一種模式,爲什麼是複合模式?
    • 本質上來說,複合模式就是解決大型設計問題的一組模式。所以他也是模式。
  • MVC只能用於網站嗎?
    • 不,網站是最好的例子,但也可以用在很多領域,比如GUI應用程序,博客等。
  • 多個視圖可以使用多個模型嗎?
    • 可以,通常會遇到需要從多個模型整理數據並在一個視圖中顯示的情況。一對一的映射在現在很少見。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章