用MVC進行重構(gòu),例:

創(chuàng)新互聯(lián)專注于樺川企業(yè)網(wǎng)站建設,成都響應式網(wǎng)站建設,商城網(wǎng)站建設。樺川網(wǎng)站建設公司,為樺川等地區(qū)提供建站服務。全流程按需定制,專業(yè)設計,全程項目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務
Step1:抽取所有界面元件的聲明和定義,整合到單獨一個函數(shù)findViews()中;
// 聲明
private Button button_calc;
private EditText field_height;
private EditText field_weight;
private TextView view_result;
private TextView view_suggest;
// 定義
private void findViews() {
button_calc = (Button) findViewById(R.id.submit);
field_height = (EditText) findViewById(R.id.height);
field_weight = (EditText) findViewById(R.id.weight);
view_result = (TextView) findViewById(R.id.result);
view_suggest = (TextView) findViewById(R.id.suggest);
}
此部分即是MVC中的V:View視圖。
Step2:抽取程序的邏輯(即界面元件的處理邏輯),整合到函數(shù)setListensers()中;
//Listen for button clicks
private void setListensers() {
button_calc.setOnClickListener(calcBMI);
}
此部分即是MVC中的C:Controller控制器。
接著,onCreate()就顯得非常簡潔、明了了:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
findViews();
setListensers();
}
Step3:修改按鈕監(jiān)聽器calcBMI中相應的部分(主要是變量已經(jīng)在視圖部分定義了);
private OnClickListener calcBMI = new OnClickListener() {
@Override
public void onClick(View v) {
DecimalFormat nf = new DecimalFormat("0.00");
double height = Double.parseDouble(field_height.getText().toString()) / 100;
double weight = Double.parseDouble(field_weight.getText().toString());
double BMI = weight / (height * height);
// Present result
view_result.setText("Your BMI is " + nf.format(BMI));
// Give health advice
if (BMI 25) {
view_suggest.setText(R.string.advice_heavy);
} else if (BMI 20) {
view_suggest.setText(R.string.advice_light);
} else {
view_suggest.setText(R.string.advice_average);
}
}
};
Step4:修剪一下“細枝末節(jié)”;
1) calcBMI的修改:
private OnClickListener calcBMI = new OnClickListener() {
……
}
改成如下:
private Button.OnClickListener calcBMI = new Button.OnClickListener() {
……
}
gasolin的解釋是:
同樣是「calcBMI」 函式,在完整程式中,改將「calcBMI」 函式從原本的「OnClickListener」宣告成 「Button.OnClickListener」。這個改變有什麼差別呢?
閱讀原本的程式碼,在匯入(import)的部分可以看到,「OnClickListener」是來自於「android.view.View.OnClickListener」函式:
import android.view.View.OnClickListener;
改成 「Button.OnClickListener」後,「Button.OnClickListener」就變成來自於「android.widget.Button」中的「OnClickListener」函式,在查閱程式時,整個「Button」與「OnClickListener」之間的關(guān)系變得更清晰。
2) 字符串統(tǒng)一引用XML中的描述符:
//Present result
view_result.setText("Your BMI is " + nf.format(BMI));
改成如下:
//Present result
view_result.setText(getText(R.string.bmi_result) + nf.format(BMI));
總之,此重構(gòu)的目的無非是使程序的脈絡更加清晰,即讓人一眼望去,就能很容易地分辨出界面(View)應該寫在哪里,程序邏輯(Controller)應該寫在哪里,最終使維護和擴展代碼變得更加容易!
重構(gòu)前的代碼Bmi.java:
package com.demo.android.bmi;
import java.text.DecimalFormat;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class Bmi extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Listen for button clicks
Button button = (Button) findViewById(R.id.submit);
button.setOnClickListener(calcBMI);
}
private OnClickListener calcBMI = new OnClickListener() {
@Override
public void onClick(View v) {
DecimalFormat nf = new DecimalFormat("0.00");
EditText fieldheight = (EditText) findViewById(R.id.height);
EditText fieldweight = (EditText) findViewById(R.id.weight);
double height = Double.parseDouble(fieldheight.getText().toString()) / 100;
double weight = Double.parseDouble(fieldweight.getText().toString());
double BMI = weight / (height * height);
TextView result = (TextView) findViewById(R.id.result);
result.setText("Your BMI is " + nf.format(BMI));
// Give health advice
TextView fieldsuggest = (TextView) findViewById(R.id.suggest);
if (BMI 25) {
fieldsuggest.setText(R.string.advice_heavy);
} else if (BMI 20) {
fieldsuggest.setText(R.string.advice_light);
} else {
fieldsuggest.setText(R.string.advice_average);
}
}
};
}
2) 重構(gòu)后的代碼Bmi.java:
package com.demo.android.bmi;
import java.text.DecimalFormat;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class Bmi extends Activity {
private Button button_calc;
private EditText field_height;
private EditText field_weight;
private TextView view_result;
private TextView view_suggest;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
findViews();
setListensers();
}
// 定義
private void findViews() {
button_calc = (Button) findViewById(R.id.submit);
field_height = (EditText) findViewById(R.id.height);
field_weight = (EditText) findViewById(R.id.weight);
view_result = (TextView) findViewById(R.id.result);
view_suggest = (TextView) findViewById(R.id.suggest);
}
// Listen for button clicks
private void setListeners() {
calcbutton.setOnClickListener(calcBMI);
}
private Button.OnClickListener calcBMI = new Button.OnClickListener() {
public void onClick(View v) {
DecimalFormat nf = new DecimalFormat("0.0");
double height = Double.parseDouble(field_height.getText().toString()) / 100;
double weight = Double.parseDouble(field_weight.getText().toString());
double BMI = weight / (height * height);
// Present result
view_result.setText(getText(R.string.bmi_result) + nf.format(BMI));
// Give health advice
if (BMI 25) {
view_suggest.setText(R.string.advice_heavy);
} else if (BMI 20) {
view_suggest.setText(R.string.advice_light);
} else {
view_suggest.setText(R.string.advice_average);
}
}
};
}
MVC全名是Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫,一種軟件設計典范,用一種業(yè)務邏輯、數(shù)據(jù)、界面顯示分離的方法組織代碼,將業(yè)務邏輯聚集到一個部件里面,在改進和個性化定制界面及用戶交互的同時,不需要重新編寫業(yè)務邏輯。其中M層處理數(shù)據(jù),業(yè)務邏輯等;V層處理界面的顯示結(jié)果;C層起到橋梁的作用,來控制V層和M層通信以此來達到分離視圖顯示和業(yè)務邏輯層。
在Android開發(fā)中,比較流行的開發(fā)框架模式采用的是MVC框架模式,采用MVC模式的好處是便于UI界面部分的顯示和業(yè)務邏輯,數(shù)據(jù)處理分開。那么Android項目中哪些代碼來充當M,V,C角色呢?
M層:適合做一些業(yè)務邏輯處理,比如數(shù)據(jù)庫存取操作,網(wǎng)絡操作,復雜的算法,耗時的任務等都在model層處理。這個和JavaEE不太一樣,javaee中model層一般只有模型,而復雜的操作一般放在業(yè)務(service)層中。
V層:應用層中處理數(shù)據(jù)顯示的部分,XML布局可以視為V層,顯示Model層的數(shù)據(jù)結(jié)果。
C層:在Android中,Activity處理用戶交互問題,因此可以認為Activity是控制器,Activity讀取V視圖層的數(shù)據(jù)(eg.讀取當前EditText控件的數(shù)據(jù)),控制用戶輸入(eg.EditText控件數(shù)據(jù)的輸入),并向Model發(fā)送數(shù)據(jù)請求(eg.發(fā)起網(wǎng)絡請求等)。
MVC、MVP和MVVM是常見的三種架構(gòu)設計模式,當前MVP和MVVM的使用相對比較廣泛,當然MVC也并沒有過時之說。
MVC (Model-View-Controller, 模型-視圖-控制器),標準的MVC是這個樣子的:
簡述:
缺點:
MVP (Model-View-Presenter) 是MVC的演化版本,幾個主要部分如下:
簡述:
解釋:
優(yōu)點:
缺點:
MVVM 是 Model-View-ViewModel 的簡寫。和 MVP 模式相比,MVVM 模式用 ViewModel 替換了 Presenter ,其他層基本上與 MVP 模式一致,ViewModel 可以理解成 是 View 的數(shù)據(jù)模型和 Presenter 的合體。MVVM 就是將其中的 View 的狀態(tài)和行為抽象化,讓我們將視圖 UI 和業(yè)務邏輯分開。
簡述:
缺點:
參考:
l模型(model)對象:是應用程序的主體部分,所有的業(yè)務邏輯都應該寫在該層。
l視圖(view)對象:是應用程序中負責生成用戶界面的部分。也是在整個mvc架構(gòu)中用戶唯一可以看到的一層,接收用戶的輸入,顯示處理結(jié)果。
l控制器(control)對象:是根據(jù)用戶的輸入,控制用戶界面數(shù)據(jù)顯示及更新model對象狀態(tài)的部分,控制器更重要的一種導航功能,想用用戶出發(fā)的相關(guān)事件,交給m哦得了處理。
MVC的架構(gòu)模式是在開發(fā)中最常用到的,下面分享一下我對MVC架構(gòu)模式的理解。
MVC全稱是Model View Controller。
在實際開發(fā)中, Model 層就是 JavaBean 實體類,用于保存實例數(shù)據(jù);View 層其實就是程序的 UI 界面,用于向用戶展示數(shù)據(jù)以及接收用戶的輸入;Controller 控制器用于更新 UI 界面和數(shù)據(jù)實例。
用MVC架構(gòu)模式實現(xiàn)登錄有關(guān)的案例:
這個是個人習慣,我一般是使用小刀注解和支持Java8。
這是最簡單的MVC案例,希望對想要了解的MVC的小伙伴有幫助。
這個問題,首先看你的架構(gòu),一切以基于你的系統(tǒng)結(jié)構(gòu)為依據(jù),否則就是在扯淡;
任何基于mvc的系統(tǒng),c是一個完整獨立的,怎么會要在activity里處理大量的業(yè)務邏輯呢?
你提這個問題,明顯已經(jīng)進入一個誤區(qū)了。
嚴格來講在android,activity和intent起到了controller的角色,所以很明顯業(yè)務邏輯不應該放在activity里。
放在系統(tǒng)結(jié)構(gòu)來看,controller肯定你要單獨自己抽出來,而不是都放在一個activity里,除非你的項目就一個activity,即使項目很簡單我也建議你抽出單獨的controller。
文章名稱:包含mvcandroid的詞條
瀏覽地址:http://chinadenli.net/article6/dsgsjig.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導航、微信公眾號、服務器托管、網(wǎng)站設計、定制網(wǎng)站、營銷型網(wǎng)站建設
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)