###### tags: `python`
# 設計模式:MVC設計模式(Model–View–Controller)
MVC介紹影片
{%youtube d5ShnrandT0%}
## 設計模式:
* 在人類程式設計經歷中淬煉出來的問題解決方法(招式)
* 跨程式語言,任何語言都可以使用,只是寫法不同
* 不同的情境適合不同的設計模式
* 設計模式可以參考但不用強迫使用
* 適合的設計模式可以讓程式開發更快速、更有彈性
## MVC(Model-View-Controller)設計模式
![](https://i.imgur.com/bfSa3tS.png)
**View:** 負責畫面呈現
**Controller:** 負責流程、邏輯處理(商業邏輯)
**Model:** 負責資料庫、檔案讀寫
流程:
1. 使用者操作畫面(view)
2. 將使用者操作或輸入資料傳controller
3. controller根據商業邏輯處理使用者資料
4. 將所需資料之要求傳給model
5. model根據需要讀寫資料庫
6. 資料庫返回處理結果或取出資料
7. model回傳資料給controller
8. controller根據商業邏輯處理回傳之資料
9. 將處理好之資料回傳view
10. view將資料整合後呈現給使用者觀看
優點:畫面、商業邏輯、資料處理分開處理,結構明確減少錯誤發生,也比較好除錯
---
## 實作MVC範例
{%youtube 4NyCi6KRPUc%}
[範例程式下載](https://drive.google.com/open?id=100P4r4DMxY0YxwzBsgT7TgFyaaXiQ0qe)
:::success
init.py (負責初始化設定)
```python=
import logging
logging.basicConfig(level=logging.DEBUG)
logging.info("載入init.py")
conn = r'C:\Users\test\Desktop\test.db' # 請修改成自己電腦存放路徑!!
sql = {
"add_user": "insert into user (name, account, password) values ('{0}', '{1}', '{2}')",
"check_user": "select * from user where account='{0}' and password='{1}';"
}
```
:::
:::success
controller.py (負責系統邏輯處理)
```python=
import init, model, view
def main():
account, password = view.login()
status, message, response = model.check_user(account, password)
if status == "success":
print("""
1. 新增使用者
2. 修改使用者
3. 刪除使用者""")
else:
init.logging.info('status: ' + status+ ' message: ' + message)
init.logging.info('response: ' + str(response))
if __name__ == '__main__':
init.logging.info("執行controller.py")
main()
```
:::
:::success
model.py (負責資料讀寫)
```python=
import sqlite3
import init
init.logging.info("載入model.py")
conn = sqlite3.connect(init.conn)
def check_user(account, password):
init.logging.info("執行model.check_user()")
try:
response = conn.execute(init.sql['check_user'].format(account, password)).fetchone()
if(response == None):
status = 'error'
message = '帳號或密碼錯誤,請重新輸入'
return status, message, response
else:
status = 'success'
message = '歡迎使用本系統'
return status, message, response
except Exception as e:
status = 'error'
message = e
return status, message, response
# def add_user(name, account, password):
# init.logging.info("執行model.add_user()")
# try:
# conn.execute(init.sql['add_user'].format(name, account, password))
# conn.commit()
# status = 'success'
# message = '成功新增使用者'
# except Exception as e:
# status = 'error'
# message = e
# return status, message
```
:::
:::success
view.py (負責畫面呈現)
```python=
import init
init.logging.info("載入view.py")
def login():
init.logging.info("執行view.login()")
account = input("請輸入帳號: ")
password = input("請輸入密碼: ")
return account, password
```
:::
![](https://i.imgur.com/arkcn9p.png =100%x)
![](https://i.imgur.com/bRMgkIu.png =100%x)
---
## 參考資料
* **Python設計模式深入解析** 博碩 Sakis Kasampalis著/江良志譯