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應用程序,博客等。
- 多個視圖可以使用多個模型嗎?
- 可以,通常會遇到需要從多個模型整理數據並在一個視圖中顯示的情況。一對一的映射在現在很少見。