本篇文章包含如下內容:java
MVC的介紹
MVC (Model View Controller),是模型(model)視圖(view)控制器(controller)的縮寫,一種軟件設計模式,用於組織代碼用一種功能模塊和數據模塊分離的方法android
- Model:模型層,負責處理數據的加載或者存儲
- View:視圖層,負責界面數據的展現,與用戶進行交互
- Controller:控制器層,負責邏輯業務的處理
MVC的模型關係圖:git
MVC設計執行的基本流程:github
首先視圖接受用戶輸入請求,而後將請求傳遞給控制器,控制器再調用某個模型來處理用戶的請求,在控制器的控制下,再將處理後的結果交給某個視圖進行格式化輸出給用戶。另外,View是能夠直接訪問Model來進行數據的處理的web
對MVC的認識:數據庫
在MVC裏,View是能夠直接訪問Model的。從而,View裏會包含Model信息,不可避免的還要包括一些業務邏輯。 在MVC模型裏,更關注的Model的不變,而同時有多個對Model的不一樣顯示,及View。因此,在MVC模型裏,Model不依賴於View,可是View是依賴於Model的。不只如此,由於有一些業務邏輯在View裏實現了,致使要更改View也是比較困難的,至少那些業務邏輯是沒法重用的設計模式
MVC優勢:markdown
- 耦合性低
- 重用性高
- 生命週期成本低
- 部署快
- 可維護性高
- 有利軟件工程化管理
MVC缺點:網絡
- 沒有明確的定義
- 不適合小型,中等規模的應用程序
- 增長系統結構和實現的複雜性
- 視圖與控制器間的過於緊密的鏈接
- 視圖對模型數據的低效率訪問
- 通常高級的界面工具或構造器不支持模式
MVC的實踐
明白了MVC是什麼以後,咱們使用個小案例來深刻了解mvc
咱們採用ListView來演示咱們的MVC模式,目錄結構:
實體類:包含了書的名字和圖片信息
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
/** * 做者:許英俊 * 實體類 * 對數據對象的封裝 */
public class Book {
private String name;
private int image;
public Book(String name,
int image) {
this.name = name;
this.image = image;
}
public String
getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getImage() {
return image;
}
public void setImage(
int image) {
this.image = image;
}
}
模型類(Model層):一般是對本地數據庫的操做或者是經過網絡請求獲取網絡數據的操做
咱們在Model裏面模擬了一個本地數據庫,並提供了增刪改查的方法
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
/** * 做者:許英俊 * 模型層 * 對數據庫的操做 */
public class BookModel {
private static List<Book> list =
new ArrayList<>();
/** * 模擬本地數據庫 */
static {
list.add(
new Book(
"Java從入門到精通", R.drawable.java));
list.add(
new Book(
"Android從入門到精通", R.drawable.android));
list.add(
new Book(
"Java從入門到精通", R.drawable.java));
list.add(
new Book(
"Android從入門到精通", R.drawable.android));
}
/** * 添加書本 * @param name * @param image */
public void addBook(String name,
int image) {
list.add(
new Book(name, image));
}
/** * 刪除書本 */
public void deleteBook( ) {
list.remove(list.size() -
1);
}
/** * 查詢數據庫全部書本 * @return */
public List<Book>
query() {
return list;
}
}
控制器(Controller層):根據Model層的方法,加上咱們的業務邏輯處理,對外提供方法並暴露接口
看delete這個方法,判斷List是否爲空(業務邏輯),使用mode.deleteBook()(Model層方法),經過listener.onComplete()(暴露接口)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
/** * 做者:許英俊 * 控制器層 * 處理業務邏輯,調用模型層的操做,並對外暴露接口 */
public class BookController {
private BookModel mode;
public BookController() {
mode =
new BookModel();
}
/** * 添加書本 * @param listener */
public void add(onAddBookListener listener) {
mode.addBook(
"JavaWeb從入門到精通", R.drawable.javaweb);
if (listener !=
null) {
listener.onComplete();
}
}
/** * 刪除書本 * @param listener */
public void delete(onDeleteBookListener listener) {
if(mode.query().isEmpty()){
return;
}
else{
mode.deleteBook();
}
if (listener !=
null) {
listener.onComplete();
}
}
/** * 查詢全部書本 * @return */
public List<Book>
query() {
return mode.query();
}
/** * 添加成功的回調接口 */
public interface onAddBookListener {
void onComplete();
}
/** * 刪除成功的回調接口 */
public interface onDeleteBookListener {
void onComplete();
}
}
視圖(View層):咱們操做Controller獲取List數據填充到ListView中,同時能夠添加書本和刪除書本
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
/** * 做者:許英俊 * 視圖層 * 發送輸入請求給控制器 */
public class BookActivity extends AppCompatActivity implements View.OnClickListener {
private BookController bookController;
private ListView lv_book;
private List<Book> list;
private BookAdapter adapter;
private Button bt_add, bt_delete;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_book);
lv_book = (ListView) findViewById(R.id.lv);
bt_add = (Button) findViewById(R.id.bt_add);
bt_delete = (Button) findViewById(R.id.bt_delete);
bt_add.setOnClickListener(
this);
bt_delete.setOnClickListener(
this);
bookController =
new BookController();
list = bookController.query();
adapter =
new BookAdapter(
this, list);
lv_book.setAdapter(adapter);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_add:
bookController.add(
new BookController.onAddBookListener() {
@Override
public void onComplete() {
adapter.notifyDataSetChanged();
}
});
break;
case R.id.bt_delete:
bookController.delete(
new BookController.onDeleteBookListener() {
@Override
public void onComplete() {
adapter.notifyDataSetChanged();
}
});
break;
}
}
}
效果圖
源碼
github:https://github.com/AndroidHensen/Design-Mode